`
8366
  • 浏览: 813214 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

使用jxl操作excle文件

阅读更多

 

     有个需求

1.要把用户从数据库查询到的明细,可以支持一xls方式的导出。

2.用户可以讲xls格式的数据导入到数据库

 

    一开始就想到了使用jxl,先热热身,看看jxl.jar的基本使用方法

 

package cn.com.xinli.util;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.text.SimpleDateFormat;
import java.util.Date;
import jxl.Sheet;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.CellFormat;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;


public class TestJXL
{
	public static void main(String[] args) throws Exception
	{   
		
		
		TestJXL.saveToEXcle();
		
		
    }  
	public static void saveToEXcle()
	{
		  // 准备设置excel工作表的标题    
        String[] title = {"编号","产品名称","产品价格","产品数量","生产日期","产地","是否出口"};    
       try {    
           // 获得开始时间    
           long start = System.currentTimeMillis();    
           // 输出的excel的路径    
            String filePath = "c:\\test.xls";    
           // 创建Excel工作薄    
            WritableWorkbook wwb;    
           // 新建立一个jxl文件,即在C盘下生成test.xls    
            OutputStream os = new FileOutputStream(filePath);    
            wwb=Workbook.createWorkbook(os);    
           // 添加第一个工作表并设置第一个Sheet的名字    
            WritableSheet sheet = wwb.createSheet("产品清单", 0);    
            Label label;    
           for(int i=0;i<title.length;i++){    
               // Label(x,y,z)其中x代表单元格的第x+1列,第y+1行, 单元格的内容是y    
               // 在Label对象的子对象中指明单元格的位置和内容    
                label = new Label(i,0,title[i]);    
               // 将定义好的单元格添加到工作表中    
                sheet.addCell(label);    
            }    
           // 下面是填充数据    
           /* 
             * 保存数字到单元格,需要使用jxl.write.Number 
             * 必须使用其完整路径,否则会出现错误 
             * */   
           // 填充产品编号    
           jxl.write.Number number = new jxl.write.Number(0,1,20071001);    
            sheet.addCell(number);    
           // 填充产品名称    
            label = new Label(1,1,"金鸽瓜子");    
            sheet.addCell(label);    
           /* 
             * 定义对于显示金额的公共格式 
             * jxl会自动实现四舍五入 
             * 例如 2.456会被格式化为2.46,2.454会被格式化为2.45 
             * */   
           jxl.write.NumberFormat nf = new jxl.write.NumberFormat("0.00");   //#.## 
           jxl.write.WritableCellFormat wcf = new jxl.write.WritableCellFormat(nf);    
           // 填充产品价格    
           jxl.write.Number nb = new jxl.write.Number(2,1,0.1,wcf);    
            sheet.addCell(nb);    
           // 填充产品数量    
           jxl.write.Number numb = new jxl.write.Number(3,1,200);    
            sheet.addCell(numb);    
           /* 
             * 定义显示日期的公共格式 
             * 如:yyyy-MM-dd hh:mm 
             * */   
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");    
            String newdate = sdf.format(new Date());    
           // 填充出产日期    
            label = new Label(4,1,newdate);    
            sheet.addCell(label);    
           // 填充产地    
            label = new Label(5,1,"陕西西安");    
            sheet.addCell(label);    
           /* 
             * 显示布尔值 
             * */   
           jxl.write.Boolean bool = new jxl.write.Boolean(6,1,true);    
            sheet.addCell(bool);    
           /* 
             * 合并单元格 
             * 通过writablesheet.mergeCells(int x,int y,int m,int n);来实现的 
             * 表示将从第x+1列,y+1行到m+1列,n+1行合并 
             * 
             * */   
            sheet.mergeCells(0,3,2,3);    
            label = new Label(0,3,"合并了三个单元格");    
            sheet.addCell(label);    
           /* 
             * 
             * 定义公共字体格式 
             * 通过获取一个字体的样式来作为模板 
             * 首先通过web.getSheet(0)获得第一个sheet 
             * 然后取得第一个sheet的第二列,第一行也就是"产品名称"的字体 
             * */   
            CellFormat cf = wwb.getSheet(0).getCell(1, 0).getCellFormat();    
            WritableCellFormat wc = new WritableCellFormat();    
           // 设置居中    
            wc.setAlignment(Alignment.CENTRE);    
           // 设置边框线    
            wc.setBorder(Border.ALL, BorderLineStyle.THIN);    
           // 设置单元格的背景颜色    
            wc.setBackground(jxl.format.Colour.RED);    
            label = new Label(1,5,"字体",wc);    
            sheet.addCell(label);    
  
           // 设置字体    
           jxl.write.WritableFont wfont = new jxl.write.WritableFont(WritableFont.createFont("隶书"),20);    
            WritableCellFormat font = new WritableCellFormat(wfont);    
            label = new Label(2,6,"隶书",font);    
            sheet.addCell(label);   
            
            /*设置列宽*/
	    	  sheet.setColumnView(0,12);
	    	  sheet.setColumnView(1,10);
	    	  sheet.setColumnView(2,8);
	    	  sheet.setColumnView(3,20);
	    	  sheet.setColumnView(4,8);
	    	  sheet.setColumnView(5,15);
	    	  sheet.setColumnView(6,12);
	    	  sheet.setColumnView(7,15);  
           // 写入数据    
            wwb.write();    
           // 关闭文件    
            wwb.close();    
           long end = System.currentTimeMillis();    
            System.out.println("----完成该操作共用的时间是:"+(end-start)/1000);    
        } catch (Exception e) {    
            System.out.println("---出现异常---");    
            e.printStackTrace();    
        }    
	}

}

 

 

下面完成需求1,导出

先决条件:

 a.mysql环境+struts

 b.建立测试使用的person表

CREATE TABLE `person` (                                
          `id` int(11) NOT NULL AUTO_INCREMENT,                
          `name` varchar(10) NOT NULL,                         
          PRIMARY KEY (`id`)                                   
        ) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=gbk  

 

 

分析:当用户点击了导出按钮,会弹出一个对话框,打开或者保存,这个是使用

 

response.setContentType("application/vnd.ms-excel;charset=GBK");//设置输出类型
response.addHeader("Content-Disposition","attachment;filename="+fileName);

 

然后使用输出流构造 WritableWorkbook 工作薄对象,吧从数据库查到的结果集,一行一行的写到xls中

 

 

需求2

 

要将xls中的数据读取出来,然后插到数据库中,关键是 拿到输入流,根据输入流构造WritableWorkbook 工作薄对象,然后使用

Sheet sheet = book.getSheet( 0 );
	         // 得到第一列第一行的单元格 
	         int columnum = sheet.getColumns(); // 得到列数 
	         int rownum = sheet.getRows(); // 得到行数 

 

 

得到行数和列数,写个双循环,拿到单元格里面的内容,构造sql语句,然后将它们插入到数据库中,关于根据单元格的内容批量执行sql,这里有一个效率问题,网上看到一个blog,受益很大(MYSQL)

 

 对于大数据量的插入,建议使用insert into tableName (x,xx,xxx) values(x,xx,xxx),(xx,xxx,xxxx)…,的方式

 

 这样只执行一个sql 就将数据插入到数据库中了,使用循环 来insert,或者使用 pstmt.addBatch()的放似乎都没有这样效率高,效率在这样写sql效率比 循环 来insert,或者使用 pstmt.addBatch() 能提高10倍左右的时间,不过sql的长度是有限制的,我们可以自己设置每1000条记录提交一次来解决

 

下面贴一下Action中的关键代码

 

package cn.com.xinli.action.user;
import java.io.DataInputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import jxl.Sheet;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import cn.com.xinli.action.BaseAction;
import cn.com.xinli.bean.User;
import cn.com.xinli.util.DBUtil;

public class ExcleOperateAction extends BaseAction
{

	Logger log=Logger.getLogger(ExcleOperateAction.class);
	@Override
	public ActionForward doIt(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception
	{
		
		String operType = request.getParameter("operType");
		log.info("operType:"+operType);
		
		if (operType != null) 
		{
			if (operType.equals("upload")) 
			{
				return upload(mapping, form, request, response);
			}
			else if(operType.equals("download"))
			{
				return download(mapping, form, request, response);
			}
		}
		return null;
		
	}
	
	
	private ActionForward download(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		log.info("开始执行导出文件操作");
		
		String fileName = new String("记录明细".getBytes("GB2312"), "ISO_8859_1");
		response.setContentType("application/vnd.ms-excel;charset=GBK");//设置输出类型
		response.addHeader("Content-Disposition","attachment;filename="+fileName);
		try
		{
			 // 创建Excel工作薄   
		      WritableWorkbook wwb;   
		      wwb = Workbook.createWorkbook(response.getOutputStream());  
		      
		      WritableCellFormat wc = new WritableCellFormat(); 
			  /*居中*/
			  wc.setAlignment(Alignment.CENTRE); 
		      // 添加第一个工作表并设置第一个Sheet的名字   
		      WritableSheet sheet = wwb.createSheet("网银明细", 0);  
		      String[] title = { "ID", "Name"};  
		      Label label;   
		      for (int i = 0; i < title.length; i++) 
		      {   
		        // Label(x,y,z)其中x代表单元格的第x+1列,第y+1行, 单元格的内容是z   
		        // 在Label对象的子对象中指明单元格的位置和内容   
		        label = new Label(i, 0, title[i],wc);
		        
		        // 将定义好的单元格添加到工作表中   
		        sheet.addCell(label);   
		      }  
		
     
      List<User> list=new ArrayList<User>();
      Connection conn=null;
      ResultSet rs=null;
      PreparedStatement pstmt;
      conn=DBUtil.getConnection();
      String sql="select * from person";
      pstmt=conn.prepareStatement(sql.toString());
      rs =pstmt.executeQuery();
      while(rs.next())
      {
    	 User user=new User();
    	 user.setId(rs.getString("id"));
    	 user.setName(rs.getString("name"));
    	 list.add(user);
      }
      if(list.size()>0)
      {
    	  int cols=0;
    	  int rows=1;
    	 
    	  for(User user : list)
    	  {
    		  Label label1=new Label(cols++,rows,user.getId(),wc);
    		  Label label2=new Label(cols++,rows,user.getName(),wc);
    		
    	      sheet.addCell(label1);
    	      sheet.addCell(label2);
    	      rows++;
    	      cols=0;
    	  }
    	  /*设置列宽*/
    	  sheet.setColumnView(0,12);
    	  sheet.setColumnView(1,10);
      
    	 
      }
      wwb.write();   
      // 关闭文件   
      wwb.close();
	}
		catch(Exception e)
		{
			
			e.printStackTrace();
		}
		return null;
	}


	private ActionForward upload(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		log.info("开始执行导入文件操作");
		try
		 {
		/*读取文件流*/
		DataInputStream in  = new DataInputStream(request.getInputStream());
		
		/*过滤HTTPHeader,否则jxl会报无法识别文件结尾的错误*/
		 for(int i = 0; i < 4; i++)
		 {
	        	in.readLine();
	     }
		 
			 Workbook book = Workbook.getWorkbook(in);
		     Sheet sheet = book.getSheet( 0 );
	         // 得到第一列第一行的单元格 
	         int columnum = sheet.getColumns(); // 得到列数 
	         int rownum = sheet.getRows(); // 得到行数 
	         System.out.println("列数:"+columnum);
	         System.out.println("行数 :"+rownum);
	         Connection conn=null;
	         PreparedStatement pstmt;
	         conn=DBUtil.getConnection();
	         StringBuffer sql = new StringBuffer("INSERT INTO person (id,name) values ");
		        
		         for ( int i =0; i < rownum; i ++) // 循环进行读写,这里从1开始是不读取第一行
		           {
		        	 	if(i!=0)
		        	 	{
		        	 		sql.append(",");
		        	 	}
		        	 	sql.append("(");
			            for ( int j = 0 ; j < columnum; j ++ )   
			            {
				             String c=sheet.getCell(j, i).getContents(); // 得到第j列第i行的单元格的内容
				             System.out.println("("+j+","+i+"):"+c);
				             sql.append("'"+c+"'");
				             if(j<columnum-1)
				             {
				            	 sql.append(",");
				             }
	
			            } 
			            sql.append(")");
		            } 
		         	pstmt=conn.prepareStatement(sql.toString());
		         	
					pstmt.execute();
					request.setAttribute("message", "上传文件成功..");
					return mapping.findForward("result");
		 }
		 catch(Exception e)
		 {
			 request.setAttribute("message", "上传文件失败.."+e.getMessage());
			 return mapping.findForward("result");
		 }
		 
				
	}


	
	}


 

 

 

关于附件:

 

1.下载附件直接可以导入到eclipse

2.mysql+person 表 可以直接 使这个web项目跑起来

 

 

参考资料:

 

http://www.blogjava.net/hankchen/archive/2009/09/01/293430.html
http://www.pcstu.com/databases/MSsql/jq/20080929/63477.html

 http://fuhao9611.iteye.com/blog/72485

 

 

 

 

 

 

 

  • jxl.rar (6.7 MB)
  • 下载次数: 64
分享到:
评论

相关推荐

    利用jxl操作excel文件

    本篇将详细介绍如何利用`jxl`库来操作Excel文件,并结合实例说明如何从Excel文件中提取数据并生成TXT文件。 首先,我们需要理解`jxl`库的基本结构。`jxl`库主要提供了`Workbook`、`Sheet`、`Cell`等类,分别对应...

    jxl操作excel文件

    ### jxl操作Excel文件知识点详解 #### 一、jxl简介 jxl 是一款用于 Java 环境下的 Excel 操作库,由一位韩国开发者所编写。与 Apache POI 相比,jxl 的功能略显简单,但在中文支持方面表现出色。jxl API 不依赖于...

    jxl操作excel文件例子

    标题“jxl操作excel文件例子”指的是利用JXL库进行Excel文件处理的实际应用。描述中提到的“通过jxl操作excel,简单方便”,暗示了JXL库的一个关键优点——简洁易用的API,使得对Excel文件的操作变得相当直观。 JXL...

    使用jxl操作Excel

    在Java编程环境中,处理Excel数据是一项常见的任务,而`jxl`库是一个广泛使用的开源库,专门用于读取和写入Microsoft Excel文件。本篇将详细介绍如何使用`jxl`库进行Excel的操作,包括导入、导出、读取以及更新Excel...

    JXL操作EXCEL 数据库导出EXCEL相关文件

    本篇文章将深入探讨JXL库在操作Excel和数据库导出Excel文件方面的应用。 首先,我们来了解JXL的基本用法。JXL支持读取和写入Biff8格式的Excel文件(即97-2003版本的.XLS文件),这涵盖了大部分常见的Excel文件需求...

    JXL操作EXCEL的各个类的解析.doc

    JXL 操作 EXCEL 的各个类的解析是 Java 语言中操作 Excel 文件的主要方法之一。JXL 通过提供了多种类来实现对 Excel 文件的读写操作。 首先,JXL 提供了一个抽象类 Workbook,该类相当于是一个工具类,用于生成 ...

    用jxl下载excel文件

    ### 使用JXL库下载并处理Excel文件 #### 知识点概述 本文将详细介绍如何使用JXL库结合Java网络编程技术来实现从指定URL下载Excel文件,并将其保存到本地指定目录的功能。此外,我们还将简单介绍如何使用JXL库读取...

    Java使用JXL操作Excel

    以上就是Java使用JXL库操作Excel的基本知识。通过这些方法,你可以创建复杂的Excel文件,处理大量的数据,并实现自定义的格式和样式。在实际项目中,JXL是一个强大且灵活的工具,能够满足各种Excel相关的编程需求。

    使用jxl解析excel(.xls)固定模板(智联简历为例)

    3. **解析保存**:使用JXL库读取并解析Excel文件。以下是一个简单的示例代码片段,展示如何打开文件并遍历工作表: ```java Workbook workbook = Workbook.getWorkbook(new File("path_to_your_excel_file")); ...

    java利用jxl读取excel文件

    `jxl`库是一个广泛使用的第三方库,它允许开发者轻松地读取、写入和修改Excel文件。本篇文章将深入探讨如何利用`jxl.jar`包来实现这一功能。 首先,确保你已经正确地将`jxl.jar`文件添加到你的项目类路径中。这可以...

    jxl操作excel实例,jxl jar包下载

    `jxl`库允许开发者使用Java语言来读写Microsoft Excel文件,无需依赖于Excel应用程序本身。本文将详细介绍如何使用`jxl`库进行Excel操作,并提供一个简单的实例。 首先,`jxl.jar`是`jxl`库的主要组件,你需要将其...

    JXL操作excel设置字体颜色设置单元格详解

    JXL操作Excel设置字体颜色设置单元格详解 JXL是一个韩国人写的Java操作Excel的工具,在开源...使用JXL操作Excel设置字体颜色设置单元格可以通过使用jxl.write.Label对象和jxl.write.WritableSheet对象的相关方法实现。

    java利用jxl生成excel文件

    Java使用JXL库生成Excel文件是一项常见的任务,特别是在数据处理、报表生成或导出时。JXL是一个开源的Java库,允许我们...JXL提供了广泛的API来处理各种复杂的Excel操作,是Java环境下生成Excel文件的一个实用工具。

    公司真正项目使用jxl操作excel代码程序

    本项目中的“公司真正项目使用jxl操作excel代码程序”是一个具体的实例,展示了如何利用Java的jxl库来与Excel文件进行交互,以满足公司报表打印的需求。 jxl是一个开源的Java库,它允许开发人员读取、写入和修改...

    使用jxl操作Excel中的下拉列表

    jxl对下拉列表的读写操作以及相应的修改功能

    Android-Android使用jxl快速导出excel表

    在这种场景下,一个常用的库是jxl,它允许开发者在Java环境中创建、读取和修改Excel文件。本文将详细探讨如何在Android应用中使用jxl库快速导出Excel表格。 首先,我们需要理解jxl库的基本概念。jxl是一个Java API...

    关于jxl操作excel说明以及jxl.jar包下载2.6

    标题"关于jxl操作excel说明以及jxl.jar包下载2.6"表明我们将探讨如何使用JXL库以及在哪里获取它的特定版本(2.6)。 首先,让我们深入了解一下JXL库。JXL是Java Excel API的简称,它提供了一套完整的API,可以创建...

    jxl 操作excel Demo

    这个"jxl操作excel Demo"显然是一份示例代码,它展示了如何使用jxl库来与Excel文件进行交互。以下是对jxl库和其在处理Excel文件中使用方法的详细说明。 1. **jxl库介绍** jxl是一个开源的Java库,允许开发者在Java...

Global site tag (gtag.js) - Google Analytics