在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中。所以今天我们就简单来看一下Java对word、excel、pdf文件的读取。本篇博客只是讲解简单应用。如果想深入了解原理。请读者自行研究一些相关源码。

 

首先我们来认识一下读取相关文档的jar包:

 

1. 引用POI包读取word文档内容

poi.jar 下载地址

http://apache.freelamp.com/poi/release/bin/poi-bin-3.6-20091214.zip http://apache.etoak.com/poi/release/bin/poi-bin-3.6-20091214.zip 
http://labs.renren.com/apache-mirror/poi/release/bin/poi-bin-3.6-20091214.zip

 

2.引用jxl包读取excel文档的内容

Jxl.jar下载地址

http://nchc.dl.sourceforge.net/project/jexcelapi/CSharpJExcel/CSharpJExcel.zip

 

3.引用PDFBox读取pdf文档的内容

Pdfbox.jar下载地址

http://labs.renren.com/apache-mirror/pdfbox/1.1.0/pdfbox-1.1.0.jar http://apache.etoak.com/pdfbox/1.1.0/pdfbox-1.1.0.jar 
http://apache.freelamp.com/pdfbox/1.1.0/pdfbox-1.1.0.jar

Fontbox.jar下载地址

http://apache.etoak.com/pdfbox/1.1.0/fontbox-1.1.0.jar http://labs.renren.com/apache-mirror/pdfbox/1.1.0/fontbox-1.1.0.jar 
http://apache.freelamp.com/pdfbox/1.1.0/fontbox-1.1.0.jar

Jempbox.jar下载地址

http://labs.renren.com/apache-mirror/pdfbox/1.1.0/jempbox-1.1.0.jar http://apache.etoak.com/pdfbox/1.1.0/jempbox-1.1.0.jar 
http://apache.freelamp.com/pdfbox/1.1.0/jempbox-1.1.0.jar

下面我们就来简单看一下这些jar包的对文档的读取的应用实例:

 

1. 引用POI包读取word文档内容

1. import java.io.File;     
2. import java.io.FileInputStream;     
3. import org.apache.poi.hwpf.HWPFDocument;     
4. import org.apache.poi.hwpf.usermodel.Range;     
5.   
6. /**  
7. *  
8. * @author 曹胜欢 
9. */   
10. public class DocFile{     
11.   
12.   
13. @Override   
14. public String getContent(File f) throws Exception {     
15. new FileInputStream(f);     
16. new HWPFDocument(fis);     
17.         Range rang = doc.getRange();     
18.         String text = rang.text();     
19.         fis.close();     
20. return text;     
21.     }     
2.引用jxl包读取excel文档的内容
 
1. import java.io.File;     
2. import java.io.FileInputStream;     
3. import jxl.Cell;     
4. import jxl.Sheet;     
5. import jxl.Workbook;     
6.   
7. /**  
8. *  
9. * @author 曹胜欢 
10. */   
11. public class XlsFile{     
12.   
13. @Override     
14. public String getContent(File f) throws Exception {     
15. //构建Workbook对象, 只读Workbook对象  
16. //直接从本地文件创建Workbook  
17. //从输入流创建Workbook  
18.   
19. new FileInputStream(f);     
20. new StringBuilder();     
21.         jxl.Workbook rwb = Workbook.getWorkbook(fis);     
22. //一旦创建了Workbook,我们就可以通过它来访问  
23. //Excel Sheet的数组集合(术语:工作表),  
24. //也可以调用getsheet方法获取指定的工资表  
25.         Sheet[] sheet = rwb.getSheets();     
26. for (int i = 0; i < sheet.length; i++) {     
27.             Sheet rs = rwb.getSheet(i);     
28. for (int j = 0; j < rs.getRows(); j++) {     
29.                Cell[] cells = rs.getRow(j);     
30. for(int k=0;k<cells.length;k++)     
31.                sb.append(cells[k].getContents());     
32.             }     
33.         }     
34.         fis.close();     
35. return sb.toString();     
36.     }     
37.   
38. }

 

由上面代码我们可知:一旦得到了Sheet,我们就可以通过它来访问Excel Cell(术语:单元格)。参考下面的代码片段:
//获取第一行,第一列的值
Cell c00 = rs.getCell(0, 0);
String strc00 = c00.getContents();
//获取第一行,第二列的值
Cell c10 = rs.getCell(1, 0);
String strc10 = c10.getContents();
当你完成对Excel电子表格数据的处理后,一定要使用close()方法来关闭先前创建的对象,以释放读取数据表的过程中所占用的内存空间,在读取大量数据时显得尤为重要。

 

3.引用PDFBox读取pdf文档的内容

1. import java.io.File;     
2. import java.io.FileInputStream;     
3. import org.pdfbox.pdfparser.PDFParser;     
4. import org.pdfbox.pdmodel.PDDocument;     
5. import org.pdfbox.util.PDFTextStripper;     
6.   
7. /**  
8. *  
9. * @author 曹胜欢 
10. */   
11. <pre name="code" class="java">public class PdfFile{     
12.   
13. public String getContent(File f) throws Exception {     
14. new FileInputStream(f);     
15. new PDFParser(fis);     
16.         p.parse();     
17.         PDDocument pdd = p.getPDDocument();     
18. new PDFTextStripper();     
19.         String c = ts.getText(pdd);     
20.         pdd.close();     
21.         fis.close();     
22. return c;     
23.     }     
24. }</pre><br>

我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式。不仅仅简单的读取office中的数据.尤其是在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作。而数据导出的格式一般是EXCEL或者PDF 。所以今天我们来简单看一下利用Apache  POI实现数据库中数据导出excel报表。在Java中有很多实现数据导出excel报表的第三方jar包。但在比较了一下感觉还是POI相对来说比较好用。如果大家想学习其他的导出方式可以自行研究一下。

 

首先来了解一下 Apache POI


     Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。Apache POI 是创建和维护操作各种符合Office Open XML(OOXML)标准和微软的OLE 2复合文档格式(OLE2)的Java API。用它可以使用Java读取和创建,修改MS Excel文件.而且,还可以使用Java读取和创建MS Word和MSPowerPoint文件。Apache POI 提供Java操作Excel解决方案(适用于Excel97-2008)。 下面我们来看一下Apache POI 中提供的几大部分的作用:

 

 

HSSF - 提供读写Microsoft Excel XLS格式档案的功能。  

XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能。  

HWPF - 提供读写Microsoft Word DOC格式档案的功能。  

HSLF - 提供读写Microsoft PowerPoint格式档案的功能。  

HDGF - 提供读Microsoft Visio格式档案的功能。  

HPBF - 提供读Microsoft Publisher格式档案的功能。  

HSMF - 提供读Microsoft Outlook格式档案的功能。 

 

       本节我们所要学习的是POI对excel的操作。所以我们只需用到HSSF 这部分内容就可以了。其他的请大家自行研究吧。哈哈。

 

 

下面我们就一步一步的来看一下如何创建一个excel报表:


1. 创建新的Excel工作薄


HSSFWorkbook workbook = new HSSFWorkbook();

在Excel工作簿中建一工作表,其名为缺省值。POI中还提供了其他的一些其他的workbook 构造方法。下面我们来看一下:

 

 

2.创建一个工作表

如要新建一名为"工资表"的工作表,其语句为:  

HSSFSheet sheet = workbook.createSheet("工资表"); 

 

3.创建行

 在索引0的位置创建行(最顶端的行)  

HSSFRow row = sheet.createRow(0);

 

4.创建单元格

在索引0的位置创建单元格(左上端)  

HSSFCell cell = row.createCell((short) 0);

定义单元格为字符串类型,这个字符串类型也可在创建单元格里面设置。

cell.setCellType(HSSFCell.CELL_TYPE_STRING); 

在单元格中输入一些内容  

cell.setCellValue("增加值"); 

 

5.新建一输出文件流,把相应的Excel工作簿 输出到本地

FileOutputStream fOut = new FileOutputStream(outputFile);

workbook.write(fOut);

fOut.flush();

操作结束,关闭文件  

fOut.close(); 

 

      OK,在给单元格设置下从数据库中读取的数据。这样我们就可以把数据库里面的内容导入到excel了。当然这里我们只是简单的介绍了一些POI的用法。并没有细讲,比如设置单元格里面数据的格式。单元格的一些属性设置。这些将会在我下面的例子中用到。也算是给大家一些示例吧。好了。最后看一个实例吧:

 

EXCEL报表工具类:ExportExcel.java

1. package com.bzu.search.action;  
2.   
3. import java.io.File;  
4. import java.io.FileNotFoundException;  
5. import java.io.FileOutputStream;  
6. import java.io.IOException;  
7.   
8. import org.apache.poi.hssf.usermodel.HSSFCell;  
9. import org.apache.poi.hssf.usermodel.HSSFCellStyle;  
10. import org.apache.poi.hssf.usermodel.HSSFFont;  
11. import org.apache.poi.hssf.usermodel.HSSFRichTextString;  
12. import org.apache.poi.hssf.usermodel.HSSFRow;  
13. import org.apache.poi.hssf.usermodel.HSSFSheet;  
14. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
15. import org.apache.poi.hssf.util.HSSFColor;  
16. import org.apache.poi.hssf.util.Region;  
17.   
18. /** 
19.  * EXCEL报表工具类. 
20.  *  
21.  * @author caoyb 
22.  * @version $Revision:$ 
23.  */  
24. public class ExportExcel {  
25.   
26. private HSSFWorkbook wb = null;  
27.   
28. private HSSFSheet sheet = null;  
29.   
30. /** 
31.      * @param wb 
32.      * @param sheet 
33.      */  
34. public ExportExcel(HSSFWorkbook wb, HSSFSheet sheet) {  
35. super();  
36. this.wb = wb;  
37. this.sheet = sheet;  
38.     }  
39.   
40. /** 
41.      * @return the sheet 
42.      */  
43. public HSSFSheet getSheet() {  
44. return sheet;  
45.     }  
46.   
47. /** 
48.      * @param sheet 
49.      *            the sheet to set 
50.      */  
51. public void setSheet(HSSFSheet sheet) {  
52. this.sheet = sheet;  
53.     }  
54.   
55. /** 
56.      * @return the wb 
57.      */  
58. public HSSFWorkbook getWb() {  
59. return wb;  
60.     }  
61.   
62. /** 
63.      * @param wb 
64.      *            the wb to set 
65.      */  
66. public void setWb(HSSFWorkbook wb) {  
67. this.wb = wb;  
68.     }  
69.   
70. /** 
71.      * 创建通用EXCEL头部 
72.      *  
73.      * @param headString 
74.      *            头部显示的字符 
75.      * @param colSum 
76.      *            该报表的列数 
77.      */  
78. public void createNormalHead(String headString, int colSum) {  
79.   
80. 0);  
81.   
82. // 设置第一行  
83. 0);  
84. short) 400);  
85.   
86. // 定义单元格为字符串类型  
87.         cell.setCellType(HSSFCell.ENCODING_UTF_16);  
88. new HSSFRichTextString("南京城区各网点进件统计报表"));  
89.   
90. // 指定合并区域  
91. new Region(0, (short) 0, 0, (short) colSum));  
92.   
93.         HSSFCellStyle cellStyle = wb.createCellStyle();  
94.   
95. // 指定单元格居中对齐  
96. // 指定单元格垂直居中对齐  
97. true);// 指定单元格自动换行  
98.   
99. // 设置单元格字体  
100.         HSSFFont font = wb.createFont();  
101.         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
102. "宋体");  
103. short) 300);  
104.         cellStyle.setFont(font);  
105.   
106.         cell.setCellStyle(cellStyle);  
107.     }  
108.   
109. /** 
110.      * 创建通用报表第二行 
111.      *  
112.      * @param params 
113.      *            统计条件数组 
114.      * @param colSum 
115.      *            需要合并到的列索引 
116.      */  
117. public void createNormalTwoRow(String[] params, int colSum) {  
118. 1);  
119. short) 300);  
120.   
121. 0);  
122.   
123.         cell2.setCellType(HSSFCell.ENCODING_UTF_16);  
124. new HSSFRichTextString("统计时间:" + params[0] + "至"  
125. 1]));  
126.   
127. // 指定合并区域  
128. new Region(1, (short) 0, 1, (short) colSum));  
129.   
130.         HSSFCellStyle cellStyle = wb.createCellStyle();  
131. // 指定单元格居中对齐  
132. // 指定单元格垂直居中对齐  
133. true);// 指定单元格自动换行  
134.   
135. // 设置单元格字体  
136.         HSSFFont font = wb.createFont();  
137.         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
138. "宋体");  
139. short) 250);  
140.         cellStyle.setFont(font);  
141.   
142.         cell2.setCellStyle(cellStyle);  
143.   
144.     }  
145.   
146. /** 
147.      * 设置报表标题 
148.      *  
149.      * @param columHeader 
150.      *            标题字符串数组 
151.      */  
152. public void createColumHeader(String[] columHeader) {  
153.   
154. // 设置列头  
155. 2);  
156.   
157. // 指定行高  
158. short) 600);  
159.   
160.         HSSFCellStyle cellStyle = wb.createCellStyle();  
161. // 指定单元格居中对齐  
162. // 指定单元格垂直居中对齐  
163. true);// 指定单元格自动换行  
164.   
165. // 单元格字体  
166.         HSSFFont font = wb.createFont();  
167.         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
168. "宋体");  
169. short) 250);  
170.         cellStyle.setFont(font);  
171.   
172. /* 
173.          * cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 设置单无格的边框为粗体 
174.          * cellStyle.setBottomBorderColor(HSSFColor.BLACK.index); // 设置单元格的边框颜色. 
175.          * cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN); 
176.          * cellStyle.setLeftBorderColor(HSSFColor.BLACK.index); 
177.          * cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN); 
178.          * cellStyle.setRightBorderColor(HSSFColor.BLACK.index); 
179.          * cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN); 
180.          * cellStyle.setTopBorderColor(HSSFColor.BLACK.index); 
181.          */  
182.   
183. // 设置单元格背景色  
184.         cellStyle.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);  
185.         cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);  
186.   
187. null;  
188.   
189. for (int i = 0; i < columHeader.length; i++) {  
190.             cell3 = row2.createCell(i);  
191.             cell3.setCellType(HSSFCell.ENCODING_UTF_16);  
192.             cell3.setCellStyle(cellStyle);  
193. new HSSFRichTextString(columHeader[i]));  
194.         }  
195.   
196.     }  
197.   
198. /** 
199.      * 创建内容单元格 
200.      *  
201.      * @param wb 
202.      *            HSSFWorkbook 
203.      * @param row 
204.      *            HSSFRow 
205.      * @param col 
206.      *            short型的列索引 
207.      * @param align 
208.      *            对齐方式 
209.      * @param val 
210.      *            列值 
211.      */  
212. public void cteateCell(HSSFWorkbook wb, HSSFRow row, int col, short align,  
213.             String val) {  
214.         HSSFCell cell = row.createCell(col);  
215.         cell.setCellType(HSSFCell.ENCODING_UTF_16);  
216. new HSSFRichTextString(val));  
217.         HSSFCellStyle cellstyle = wb.createCellStyle();  
218.         cellstyle.setAlignment(align);  
219.         cell.setCellStyle(cellstyle);  
220.     }  
221.   
222. /** 
223.      * 创建合计行 
224.      *  
225.      * @param colSum 
226.      *            需要合并到的列索引 
227.      * @param cellValue 
228.      */  
229. public void createLastSumRow(int colSum, String[] cellValue) {  
230.   
231.         HSSFCellStyle cellStyle = wb.createCellStyle();  
232. // 指定单元格居中对齐  
233. // 指定单元格垂直居中对齐  
234. true);// 指定单元格自动换行  
235.   
236. // 单元格字体  
237.         HSSFFont font = wb.createFont();  
238.         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
239. "宋体");  
240. short) 250);  
241.         cellStyle.setFont(font);  
242.   
243. short) (sheet.getLastRowNum() + 1));  
244. 0);  
245.   
246. new HSSFRichTextString("合计"));  
247.         sumCell.setCellStyle(cellStyle);  
248. new Region(sheet.getLastRowNum(), (short) 0,  
249. short) colSum));// 指定合并区域  
250.   
251. for (int i = 2; i < (cellValue.length + 2); i++) {  
252.             sumCell = lastRow.createCell(i);  
253.             sumCell.setCellStyle(cellStyle);  
254. new HSSFRichTextString(cellValue[i - 2]));  
255.   
256.         }  
257.   
258.     }  
259.   
260. /** 
261.      * 输入EXCEL文件 
262.      *  
263.      * @param fileName 
264.      *            文件名 
265.      */  
266. public void outputExcel(String fileName) {  
267. null;  
268. try {  
269. new FileOutputStream(new File(fileName));  
270.             wb.write(fos);  
271.             fos.close();  
272. catch (FileNotFoundException e) {  
273.             e.printStackTrace();  
274. catch (IOException e) {  
275.             e.printStackTrace();  
276.         }  
277.     }  
278. }

报表生成类:ComplexExportExcelClient.java

1. package com.bzu.search.action;  
2.   
3. import java.util.ArrayList;  
4. import java.util.List;  
5.   
6. import org.apache.poi.hssf.usermodel.HSSFCell;  
7. import org.apache.poi.hssf.usermodel.HSSFCellStyle;  
8. import org.apache.poi.hssf.usermodel.HSSFFont;  
9. import org.apache.poi.hssf.usermodel.HSSFRichTextString;  
10. import org.apache.poi.hssf.usermodel.HSSFRow;  
11. import org.apache.poi.hssf.usermodel.HSSFSheet;  
12. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
13. import org.apache.poi.hssf.util.Region;  
14.   
15. /** 
16.  * 拒绝件报表生成类. 
17.  *  
18.  * @author caoyb 
19.  * @version $Revision:$ 
20.  */  
21. public class ComplexExportExcelClient {  
22.   
23. private static HSSFWorkbook wb = new HSSFWorkbook();  
24.   
25. private static HSSFSheet sheet = wb.createSheet();  
26.   
27. @SuppressWarnings({ "unchecked", "deprecation" })  
28. public static void main(String[] args) {  
29.   
30. new ExportExcel(wb, sheet);  
31.   
32. // 创建列标头LIST  
33. new ArrayList();  
34.   
35. "申请人未提供任何联系方式");  
36. "无工作单位信息且未提供收入来源信息");  
37. "有工作单位但未提供单位地址或电话");  
38. "家庭地址缺失");  
39. "客户身份证明资料缺");  
40. "签名缺失或签名不符合要求");  
41. "其它");  
42.   
43. new ArrayList();  
44.   
45. "客户主动取消");  
46. "个人征信不良");  
47. "欺诈申请");  
48. "申请人基本条件不符");  
49. "申请材料不合规");  
50. "无法正常完成征信");  
51. "重复申请");  
52. "其他");  
53.   
54. // 计算该报表的列数  
55. int number = 2 + fialList.size() * 2 + errorList.size() * 2;  
56.   
57. // 给工作表列定义列宽(实际应用自己更改列数)  
58. for (int i = 0; i < number; i++) {  
59. 3000);  
60.         }  
61.   
62. // 创建单元格样式  
63.         HSSFCellStyle cellStyle = wb.createCellStyle();  
64.   
65. // 指定单元格居中对齐  
66.         cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
67.   
68. // 指定单元格垂直居中对齐  
69.         cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);  
70.   
71. // 指定当单元格内容显示不下时自动换行  
72. true);  
73.   
74. // 设置单元格字体  
75.         HSSFFont font = wb.createFont();  
76.         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
77. "宋体");  
78. short) 200);  
79.         cellStyle.setFont(font);  
80.   
81. // 创建报表头部  
82. "南京地区申请资料拒件分析统计", number);  
83.   
84. // 设置第二行  
85. new String[] { "    年  月  日", "  年  月  日" };  
86.         exportExcel.createNormalTwoRow(params, number);  
87.   
88. // 设置列头  
89. 2);  
90.   
91. 0);  
92.         cell0.setCellStyle(cellStyle);  
93. new HSSFRichTextString("机构代码"));  
94.   
95. 1);  
96.         cell1.setCellStyle(cellStyle);  
97. new HSSFRichTextString("支行名称"));  
98.   
99. 2);  
100.         cell2.setCellStyle(cellStyle);  
101. new HSSFRichTextString("无效件"));  
102.   
103. 2 * fialList.size() + 2);  
104.         cell3.setCellStyle(cellStyle);  
105. new HSSFRichTextString("拒绝件"));  
106.   
107. 3);  
108.   
109. // 设置行高  
110. short) 800);  
111.   
112. null;  
113. int m = 0;  
114. int n = 0;  
115.   
116. // 创建不同的LIST的列标题  
117. for (int i = 2; i < number; i = i + 2) {  
118.   
119. if (i < 2 * fialList.size() + 2) {  
120.                 row3Cell = row3.createCell(i);  
121.                 row3Cell.setCellStyle(cellStyle);  
122. new HSSFRichTextString(fialList.get(m)  
123.                         .toString()));  
124.                 m++;  
125. else {  
126.                 row3Cell = row3.createCell(i);  
127.                 row3Cell.setCellStyle(cellStyle);  
128. new HSSFRichTextString(errorList.get(n)  
129.                         .toString()));  
130.                 n++;  
131.             }  
132.   
133.         }  
134.   
135. // 创建最后一列的合计列  
136.         row3Cell = row3.createCell(number);  
137.         row3Cell.setCellStyle(cellStyle);  
138. new HSSFRichTextString("合计"));  
139.   
140. // 合并单元格  
141. 4);  
142.   
143. // 合并第三行到第五行的第一列  
144. new Region(2, (short) 0, 4, (short) 0));  
145.   
146. // 合并第三行到第五行的第二列  
147. new Region(2, (short) 1, 4, (short) 1));  
148.   
149. // 合并第三行的第三列到第AA指定的列  
150. int aa = 2 * fialList.size() + 1;  
151. new Region(2, (short) 2, 2, (short) aa));  
152.   
153. int start = aa + 1;  
154.   
155. new Region(2, (short) start, 2,  
156. short) (number - 1)));  
157.   
158. // 循环合并第四行的行,并且是每2列合并成一列  
159. for (int i = 2; i < number; i = i + 2) {  
160. new Region(3, (short) i, 3, (short) (i + 1)));  
161.   
162.         }  
163.   
164. // 根据列数奇偶数的不同创建不同的列标题  
165. for (int i = 2; i < number; i++) {  
166. if (i < 2 * fialList.size() + 2) {  
167.   
168. if (i % 2 == 0) {  
169.                     HSSFCell cell = row4.createCell(i);  
170.                     cell.setCellStyle(cellStyle);  
171. new HSSFRichTextString("无效量"));  
172. else {  
173.                     HSSFCell cell = row4.createCell(i);  
174.                     cell.setCellStyle(cellStyle);  
175. new HSSFRichTextString("占比"));  
176.                 }  
177. else {  
178. if (i % 2 == 0) {  
179.                     HSSFCell cell = row4.createCell(i);  
180.                     cell.setCellStyle(cellStyle);  
181. new HSSFRichTextString("拒绝量"));  
182. else {  
183.                     HSSFCell cell = row4.createCell(i);  
184.                     cell.setCellStyle(cellStyle);  
185. new HSSFRichTextString("占比"));  
186.                 }  
187.             }  
188.   
189.         }  
190.   
191. // 循环创建中间的单元格的各项的值  
192. for (int i = 5; i < number; i++) {  
193. short) i);  
194. for (int j = 0; j <= number; j++) {  
195.                 exportExcel  
196. short) j,  
197.                                 HSSFCellStyle.ALIGN_CENTER_SELECTION, String  
198.                                         .valueOf(j));  
199.             }  
200.   
201.         }  
202.   
203. // 创建最后一行的合计行  
204. new String[number - 1];  
205. for (int i = 0; i < number - 1; i++) {  
206.             cellValue[i] = String.valueOf(i);  
207.   
208.         }  
209. 1, cellValue);  
210.   
211. "c:\\拒绝件统计.xls");  
212.   
213.     }  
214. }

利用Apache开源项目POI实现数据库数据导出excel报表的知识。其实在Java世界里,有两套成熟的开源工具支持对Excel文件的操作:一个是Apache POI;另一个则是本文将要介绍的Java Excel API。Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对Microsoft Office格式档案读/写功能。该项目分为几个组件,其中包括一个HSSF的组件,它是一个非常正规和严谨的API。利用HSSF,你可以用纯Java代码来读取、写入、修改Excel文件 。Java Excel API(JXL),它是一套纯粹使用Java开发的Excel表格操作组件,使用它,即使在非Windows操作系统下,程序员也可以通过纯 Java 应用来创建Excel文件,并能够读取,写入,更新Excel中的内容,因此,基于JXL可以实现对数据库中数据导入导出的操作。与POI相比,JXL拥有更小的内存占用率和对中文更好的支持,所以这篇文字我们就来看一下数据库数据导入导出基于JXL的方法。顺便介绍一下jxl与POI的区别。其实从原理上,个人感觉这两种方式很相似,就连代码也挺像。下面我们就来看一下简单的操作步骤吧。

 

jxl下载地址:http://www.andykhan.com/jexcelapi/download.html 

基本步骤:

1.创建一个工作薄

WritableWorkbook book=Workbook.createWorkbook(new File(“测试.xls”)); 

2.生成名为“第一页”的工作表,参数0表示这是第一页  

WritableSheet sheet=book.createSheet(“第一页”,0); 

3.创建单元格。在Label对象的构造方法中指明单元格位置是第一列第一行(0,0)以及单元格内容为test 

Label label=new Label(0,0,”test”); 

4.将定义好的单元格添加到工作表中  

sheet.addCell(label); 

 

Jxl提供了一个专门创造数字类型的单元格,生成一个保存数字的单元格必须使用Number的完整包路径,否则有语法歧义单元格位置是第二列,第一行,值为123.123*/

jxl.write.Number number=new jxl.write.Number(1,0,123.123);sheet.addCell(number); 

5.写入数据并关闭文件  

book.write();

book.close(); 

关于Excle的一些操作:

1、 字串格式化

 字符串的格式化涉及到的是字体、粗细、字号等元素,这些功能主要由WritableFont和
 WritableCellFormat类来负责。假设我们在生成一个含有字串的单元格时,使用如下语句,
 为方便叙述,我们为每一行命令加了编号:


1. WritableFont font1 =   
2. new  WritableFont(WritableFont.TIMES, 16 ,WritableFont.BOLD); ①  
3.   
4. new  WritableCellFormat(font1); ②  
5.   
6. new  Label( 0 , 0 ,”data  4  test”,format1) ③

 其中①指定了字串格式:字体为TIMES,字号16,加粗显示。WritableFont有非常丰富的
 构造子,供不同情况下使用,jExcelAPI的java-doc中有详细列表,这里不再列出。

 ②处代码使用了WritableCellFormat类,这个类非常重要,通过它可以指定单元格的各种
 属性,后面的单元格格式化中会有更多描述。

 ③处使用了Label类的构造子,指定了字串被赋予那种格式。

在WritableCellFormat类中,还有一个很重要的方法是指定数据的对齐方式,比如针对我们
 上面的实例,可以指定:

   // 把水平对齐方式指定为居中 
  format1.setAlignment(jxl.format.Alignment.CENTRE);

  // 把垂直对齐方式指定为居中 
  format1.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);

 

2、单元格操作

 Excel中很重要的一部分是对单元格的操作,比如行高、列宽、单元格合并等,所幸jExcelAPI
 提供了这些支持。这些操作相对比较简单,下面只介绍一下相关的API。

 

 1)、 合并单元格

  WritableSheet.mergeCells( int  m, int  n, int  p, int  q); 

  // 作用是从(m,n)到(p,q)的单元格全部合并,比如: 
  WritableSheet sheet = book.createSheet(“第一页”, 0 );

  // 合并第一列第一行到第六列第一行的所有单元格 
  sheet.mergeCells( 0 , 0 , 5 , 0 );

 合并既可以是横向的,也可以是纵向的。合并后的单元格不能再次进行合并,否则会触发异常。

 

 2)、 行高和列宽

  WritableSheet.setRowView( int  i, int  height);

  // 作用是指定第i+1行的高度,比如:

  // 将第一行的高度设为200 
  sheet.setRowView( 0 , 200 );

 WritableSheet.setColumnView( int  i, int  width);

  // 作用是指定第i+1列的宽度,比如:

  // 将第一列的宽度设为30 
  sheet.setColumnView( 0 , 30 );

 

jxl还有其他的一些功能,比如插入图片等,这里就不再一一介绍,读者可以自己探索。

POI和jxl区别:

从JVM虚拟机内存消耗的情况.

数据量3000条数据,每条60列.JVM虚拟机内存大小64M.

使用POI:运行到2800条左右就报内存溢出.

使用JXL:3000条全部出来,并且内存还有21M的空间.

可想而知,在对内存的消耗方面差距还是挺大的.

也许是由于JXL在对资源回收利用方面做的还挺不错的.

 

从提供的功能的情况

JXL相对弱了点.没有提供像POI那样复杂的功能,比如添加图片功能。所以如果要实现的功能比较复杂的情况下可以考虑使用POI

最后来看一个小例子:

 

1. import java.io.File;  
2. import java.io.FileOutputStream;  
3. import java.io.OutputStream;  
4. import java.sql.Connection;  
5. import java.sql.DriverManager;  
6. import java.sql.ResultSet;  
7. import java.sql.SQLException;  
8. import java.sql.Statement;  
9. import jxl.Workbook;  
10. import jxl.write.Label;  
11. import jxl.write.WritableCellFormat;  
12. import jxl.write.WritableFont;  
13. import jxl.write.WritableSheet;  
14. import jxl.write.WritableWorkbook;  
15. public class DateToExcel {  
16. private String driverClass = "com.mysql.jdbc.Driver";  
17. private String url = "jdbc:MySQL://localhost/boutiquecourse";  
18. private String user = "root";  
19. private String password = "";  
20. private Connection connection;  
21. public void exportClassroom(OutputStream os) {  
22. try {  
23. // 建立excel文件  
24. "测试转换", 0); // 工作表名称  
25. //设置Excel字体  
26. new WritableFont(WritableFont.ARIAL, 16,  
27. false,  
28.    jxl.format.UnderlineStyle.NO_UNDERLINE,  
29.    jxl.format.Colour.BLACK);  
30. new WritableCellFormat(wfont);  
31.      
32. "测试编号", "测试名称"};//如果还有字段的话,以此类推  
33. // 设置Excel表头  
34. for (int i = 0; i < title.length; i++) {  
35. new Label(i, 0, title[i], titleFormat);  
36.     wsheet.addCell(excelTitle);  
37.    }  
38. int c = 1; // 用于循环时Excel的行号  
39.    Connection con = openConnection();  
40.    Statement st = con.createStatement();  
41. "select * from test";  
42. // 这个是从数据库中取得要导出的数据  
43. while (rs.next()) {  
44. new Label(0, c, (String) rs.getString("testid"));  
45. new Label(1, c, (String) rs.getString("testname"));  
46. //如果还有的话,以此类推  
47.     wsheet.addCell(content1);  
48.     wsheet.addCell(content2);  
49. //如果还有的话,以此类推  
50.     c++;  
51.    }  
52. // 写入文件  
53.    wbook.close();  
54.    os.close();  
55. "导入成功!");  
56. catch (Exception e) {  
57.    e.printStackTrace();  
58.   }  
59.  }  
60. public Connection openConnection() throws SQLException {  
61. try {  
62.    Class.forName(driverClass).newInstance();  
63.    connection = DriverManager.getConnection(url, user, password);  
64. return connection;  
65. catch (Exception e) {  
66. throw new SQLException(e.getMessage());  
67.   }  
68.  }  
69. public void closeConnection() {  
70. try {  
71. if (connection != null)  
72.     connection.close();  
73. catch (Exception e) {  
74.    e.printStackTrace();  
75.   }  
76.  }  
77. public static void main(String[] args) {  
78. new DateToExcel();  
79. new File("D:/kk.xls");  
80. //File f = new File("D:\\kk.xls");  
81. try {  
82.    f.createNewFile();  
83. new FileOutputStream(f);  
84.    te.exportClassroom(os);  
85. catch (Exception e) {  
86.    e.printStackTrace();  
87.   }  
88.  }  
89. }  
90.