`
viwo
  • 浏览: 220111 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Java操作Excel之理解JXL--读取Excel模板动态写入数据并生成Excel

    博客分类:
  • JAVA
阅读更多

上一篇文章 Java操作Excel之理解JXL--读取Excel 说到如何用JXL读取Excel文件,
现在来看看如何读取Excel模板然后把动态数据写入到模板以生成特定格式的Excel。
同样的思路,先来考虑下会涉及到那些对象,和上篇文章读取相比这里涉及到一个写入的步骤,所以JXL必然会提供一个对象
来支持写入,这就是WritableWorkbook。那么如何得到到这个类的实例,查看APIDoc发现Workbook类提供了几个
静态的createWorkbook方法返回WritableWorkbook实例,可以看到众多createWorkbook方法主要分为两类:一个参数
和两个参数。简单分析可以得知前者仅仅是用来直接生成Excel文件,后者先读取模板再向模板写入数据然后生成Excel。
(还有一个三参数方法加上一个用来设置workbook的参数)
现在按照上篇文章中所讲述的流程来看看读取模板并写入需要那些步骤。

第一步:选择模板文件:
Workbook wb = Workbook.getWorkbook(new File(realpath));

第二步:通过模板得到一个可写的Workbook:
WritableWorkbook wwb = Workbook.createWorkbook(targetFile, wb);
第一个参数是一个输出流对象,比如可以
ByteArrayOutputStream targetFile = new ByteArrayOutputStream();
这样定义这个输出流对象。第二个参数代表了要读取的模板。


第三步:选择模板中名称为StateResult的Sheet:
WritableSheet wws = wwb.getSheet("StateResult");
如果需要也可以创建Sheet
WritableSheet wws = wwb.createSheet("Sheet名称",i);


第四步:选择单元格,写入动态值,根据单元格的不同类型转换成相应类型的单元格:
Label A1 = (Label)wws.getWritableCell(0,0);
A1.setString("单元格内容")

Number A2 = (Number)wws.getWritableCell(0,1);//Number是jxl.write.Number
A2.setValue(3.3);
也可以创建新的单元格并且加入到Sheet中
Label C1 = new Label(2,0,"单元格内容");
wws.addCell(C1);

Number C1 = new Number(2,0,3.3);
wws.addCell(C1);

在生成Excel报表的时候还会遇到一种需求就是数据的格式问题,我们可能希望数值型单元格以某种格式显示,而字符串型单元格以另

一种格式显示。这些可以通过WritableFont、NumberFormat、WritableCellFormat等实现,下例给单元格A1、A2添加了不同的格式。

java 代码
  1. WritableFont font= new WritableFont(WritableFont.createFont("宋体"),10,WritableFont.NO_BOLD);   
  2. NumberFormat format = new NumberFormat("###,##0.00"); //NumberFormat是jxl.write.NumberFormat   
  3. WritableCellFormat cellFormat1 = new WritableCellFormat(font,format);   
  4. WritableCellFormat cellFormat2 = new WritableCellFormat(font);   
  5. cellFormat1.setBorder(Border.ALL, jxl.format.BorderLineStyle.THIN); //Border是jxl.format.Border   
  6. cellFormat2.setBorder(Border.ALL, jxl.format.BorderLineStyle.THIN); //Border是jxl.format.Border   
  7. A2.setCellFormat(cellFormat1);   
  8. A1.setCellFormat(cellFormat2);  

还有不要忘记关闭WritableWorkbook和Workbook以释放资源:
wwb.close();
wb.close();

最后就可以你需要的方式从输出流targetFile中取得Excel,比如直接生成文件存本地,输出到客户端浏览器等。

如果还有其他需求,按照这种思路,再参照APIDoc相信可以很容易的解决。

至此,Java操作Excel之理解JXL就写完了。下一篇会介绍如何用Jakarta POI操作Excel。

 

分享到:
评论
10 楼 hbcui1984 2007-05-28  
jwen 写道
最近也在为出报表郁闷,格式要求很严格
看了你的通过读取模板写入动态数据生成excel  我试着测试了一下 结果excel完全没任何反映,

希望你指点指点  谢谢


public class JxlExcel{
	public static void main(String[] args)
	{ 
		try
		{
			String url="D:/template/test.xls";
			//第一步:选择模板文件 通过模板得到一个可写的Workbook:
			Workbook wb = Workbook.getWorkbook(new File(url));
			//这样定义这个输出流对象。第二个参数代表了要读取的模板。
			ByteArrayOutputStream targetFile = new ByteArrayOutputStream();

			WritableWorkbook wwb = Workbook.createWorkbook(targetFile, wb);
			//第一个参数是一个输出流对象,比如可以
			//第三步:选择模板的Sheet:
			WritableSheet wws = wwb.getSheet(0);
			//第四步:选择单元格,写入动态值,根据单元格的不同类型转换成相应类型的单元格:
/*			Label A1 = (Label)wws.getWritableCell(2,0);
			A1.setString("单元格内容");*/
			Label C1 = new Label(2,0,"单元格内容");
			wws.addCell(C1);
			wwb.close();
			wb.close();
			System.out.println("盒封面.xls");
		}
		catch (Exception e)
		{
			e.printStackTrace();
		} 
	
	}  
}


楼主介绍的方法只是把数据写入到了流中,并没有真正写入文件中,当然不会有反应了。

很早之前写过一篇介绍jxl的文章:
http://www.iteye.com/topic/55844?page=1
不过今天从楼主文章中看到如何读取模板,不错的
9 楼 jwen 2007-05-28  
感谢 viwo
8 楼 viwo 2007-05-27  
liht80 写道
在java中用jxl操作EXCEL
Workbook book = Workbook.getWorkbook(new File("D:\\project.xls"));
Sheet sheet = book.getSheet(0);
Cell cell=sheet.getCell(0,4);
String result=cell.getContents();
System.out.println("########################### " +result);

为什么在程序执行到Sheet sheet = book.getSheet(0);时,会抛NullPointerException呢???
读入的EXCEL文件的路径是正确的,D盘下确有此文件呀。
并且相同的代码,换个EXCEL文件就没有问题,可是我要读的是project.xls文件呀。
为什么会这样呢?

Sheet sheet = book.getSheet(0);抛NullPointerException的可能性不大,
Workbook book = Workbook.getWorkbook(new File("D:\\project.xls"));倒是有可能抛IOException或者jxl.read.biff.BiffException。
除非你在Workbook book = Workbook.getWorkbook(new File("D:\\project.xls")); 周围try catch或者在其后sheet=null;
7 楼 viwo 2007-05-27  
jwen 写道
最近也在为出报表郁闷,格式要求很严格
看了你的通过读取模板写入动态数据生成excel  我试着测试了一下 结果excel完全没任何反映,

希望你指点指点  谢谢


public class JxlExcel{
	public static void main(String[] args)
	{ 
		try
		{
			String url="D:/template/test.xls";
			//第一步:选择模板文件 通过模板得到一个可写的Workbook:
			Workbook wb = Workbook.getWorkbook(new File(url));
			//这样定义这个输出流对象。第二个参数代表了要读取的模板。
			ByteArrayOutputStream targetFile = new ByteArrayOutputStream();

			WritableWorkbook wwb = Workbook.createWorkbook(targetFile, wb);
			//第一个参数是一个输出流对象,比如可以
			//第三步:选择模板的Sheet:
			WritableSheet wws = wwb.getSheet(0);
			//第四步:选择单元格,写入动态值,根据单元格的不同类型转换成相应类型的单元格:
/*			Label A1 = (Label)wws.getWritableCell(2,0);
			A1.setString("单元格内容");*/
			Label C1 = new Label(2,0,"单元格内容");
			wws.addCell(C1);
			wwb.close();
			wb.close();
			System.out.println("盒封面.xls");
		}
		catch (Exception e)
		{
			e.printStackTrace();
		} 
	
	}  
}


如下:
public class JxlExcel{   
    public static void main(String[] args)   
    {    
        try  
        {   
            String url="c:/test.xls";   
              Workbook wb = Workbook.getWorkbook(new File(url));    
              ByteArrayOutputStream targetFile = new ByteArrayOutputStream();  
            WritableWorkbook wwb = Workbook.createWorkbook(targetFile, wb);   
              WritableSheet wws = wwb.getSheet(0);   
            Label C1 = new Label(2,0,"单元格内容");   
            wws.addCell(C1);   
            wwb.write();
            wwb.close();
            wb.close();  
            FileOutputStream fos = new FileOutputStream("c:/test1.xls");
            targetFile.writeTo(fos);
            targetFile.close();
            System.out.println("盒封面.xls");   
        }   
        catch (Exception e)   
        {   
            e.printStackTrace();   
        }    
       
    }     
}  

6 楼 liht80 2007-05-24  
在java中用jxl操作EXCEL
Workbook book = Workbook.getWorkbook(new File("D:\\project.xls"));
Sheet sheet = book.getSheet(0);
Cell cell=sheet.getCell(0,4);
String result=cell.getContents();
System.out.println("########################### " +result);

为什么在程序执行到Sheet sheet = book.getSheet(0);时,会抛NullPointerException呢???
读入的EXCEL文件的路径是正确的,D盘下确有此文件呀。
并且相同的代码,换个EXCEL文件就没有问题,可是我要读的是project.xls文件呀。
为什么会这样呢?
5 楼 Readonly 2007-05-24  
http://www.iteye.com/topic/75431
4 楼 dovecat 2007-05-24  
用jxls吧.比poi要好用.
3 楼 qmy 2007-05-24  
学习来了,感谢楼主。
2 楼 jwen 2007-05-24  
最近也在为出报表郁闷,格式要求很严格
看了你的通过读取模板写入动态数据生成excel  我试着测试了一下 结果excel完全没任何反映,

希望你指点指点  谢谢


public class JxlExcel{
	public static void main(String[] args)
	{ 
		try
		{
			String url="D:/template/test.xls";
			//第一步:选择模板文件 通过模板得到一个可写的Workbook:
			Workbook wb = Workbook.getWorkbook(new File(url));
			//这样定义这个输出流对象。第二个参数代表了要读取的模板。
			ByteArrayOutputStream targetFile = new ByteArrayOutputStream();

			WritableWorkbook wwb = Workbook.createWorkbook(targetFile, wb);
			//第一个参数是一个输出流对象,比如可以
			//第三步:选择模板的Sheet:
			WritableSheet wws = wwb.getSheet(0);
			//第四步:选择单元格,写入动态值,根据单元格的不同类型转换成相应类型的单元格:
/*			Label A1 = (Label)wws.getWritableCell(2,0);
			A1.setString("单元格内容");*/
			Label C1 = new Label(2,0,"单元格内容");
			wws.addCell(C1);
			wwb.close();
			wb.close();
			System.out.println("盒封面.xls");
		}
		catch (Exception e)
		{
			e.printStackTrace();
		} 
	
	}  
}

相关推荐

Global site tag (gtag.js) - Google Analytics