在平常应用程序中,对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. * @author 曹胜欢
  8. */
  9. public class DocFile{
  10. @Override
  11. public String getContent(File f) throws Exception {
  12. FileInputStream fis = new FileInputStream(f);
  13. HWPFDocument doc = new HWPFDocument(fis);
  14. Range rang = doc.getRange();
  15. String text = rang.text();
  16. fis.close();
  17. return text;
  18. }

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. * @author 曹胜欢
  9. */
  10. public class XlsFile{
  11. @Override
  12. public String getContent(File f) throws Exception {
  13. //构建Workbook对象, 只读Workbook对象
  14. //直接从本地文件创建Workbook
  15. //从输入流创建Workbook
  16. FileInputStream fis = new FileInputStream(f);
  17. StringBuilder sb = new StringBuilder();
  18. jxl.Workbook rwb = Workbook.getWorkbook(fis);
  19. //一旦创建了Workbook,我们就可以通过它来访问
  20. //Excel Sheet的数组集合(术语:工作表),
  21. //也可以调用getsheet方法获取指定的工资表
  22. Sheet[] sheet = rwb.getSheets();
  23. for (int i = 0; i < sheet.length; i++) {
  24. Sheet rs = rwb.getSheet(i);
  25. for (int j = 0; j < rs.getRows(); j++) {
  26. Cell[] cells = rs.getRow(j);
  27. for(int k=0;k<cells.length;k++)
  28. sb.append(cells[k].getContents());
  29. }
  30. }
  31. fis.close();
  32. return sb.toString();
  33. }
  34. }

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

报表生成类:ComplexExportExcelClient.java

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

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

java操作office和pdf文件java读取word,excel和pdf文档内容的更多相关文章

  1. java操作mongodb数据库实现新建数据库,新建集合,新建文档

    *首先明确一点,要通过java代码创建mongodb数据库实例,需要同时创建集合和文档. 代码实现: /* 建立与mongodb数据库的连接,可指定参数,如:MongoClient client = ...

  2. 打开PDF文件弹出阅读未加标签文档的解决方法

    在“高级”菜单的“辅助工具”选中“设置助手”,然后点选“设置屏幕阅读器选项”,下一步之后,将“忽略已加标签文档的阅读顺序”和“添加标签到文档之前进行确认”(有的版本显示的是“为文档加标签前确认”)前面 ...

  3. Linux系统下Java 转换Word到PDF时,结果文档内容乱码的解决方法

    本文分享在Linux系统下,通过Java 程序代码将Word转为PDF文档时,结果文档内容出现乱码该如何解决.具体可参考如下内容: 1.问题出现的背景 在Windows系统中,使用Spire.Doc ...

  4. lucent检索技术之创建索引:使用POI读取txt/word/excel/ppt/pdf内容

    在使用lucent检索文档时,必须先为各文档创建索引.索引的创建即读出文档信息(如文档名称.上传时间.文档内容等),然后再经过分词建索引写入到索引文件里.这里主要是总结下读取各类文档内容这一步. 一. ...

  5. XML解析之sax解析案例(一)读取contact.xml文件,完整输出文档内容

    一.新建Demo2类: import java.io.File; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXPar ...

  6. 办公室文员必备python神器,将PDF文件表格转换成excel表格!

    [阅读全文] 第三方库说明 # PDF读取第三方库 import pdfplumber # DataFrame 数据结果处理 import pandas as pd 初始化DataFrame数据对象 ...

  7. Atitit.office word  excel  ppt pdf 的web在线预览方案与html转换方案 attilax 总结

    Atitit.office word  excel  ppt pdf 的web在线预览方案与html转换方案 attilax 总结 1. office word  excel pdf 的web预览要求 ...

  8. PDF文件如何标注,怎么使用PDF标注工具

    我们在使用文件的时候需要给文件的部分添加标注,能够更加直观的了解文件,但是有很多小伙伴们对于PDF文件怎么添加标注都不知道,也不知道PDF标注工具要怎么使用,那么下面就跟大家分享一下怎么使用PDF标注 ...

  9. 在线打开,浏览PDF文件的各种方式及各种pdf插件------(MS OneDrive/google drive & google doc/ github ?raw=true)

    在线打开,浏览PDF文件的各种方式: 1 Google drive&doc   (国内不好使,you know GFW=Great Firewall) 1. google drive: 直接分 ...

随机推荐

  1. Create AI Guard Class

    创建FPSAIGuard类 不需要玩家输入,删除多余的函数 FPSAIGuard.h #include "CoreMinimal.h" #include "GameFra ...

  2. php编程 之 php基础二

    1,if...else...语句 规则简介: if 语句 - 在条件成立时执行代码 if...else 语句 - 在条件成立时执行一块代码,条件不成立时执行另一块代码 if...elseif....e ...

  3. 对mysql乐观锁、悲观锁、共享锁、排它锁、行锁、表锁概念的理解

    乐观锁 乐观锁是指操作数据库时(更新操作),想法很乐观,认为这次的操作不会导致冲突,在操作数据时,并不进行任何其他的特殊处理(也就是不加锁),而在进行更新后,再去判断是否有冲突了. 实现: 通常实现是 ...

  4. EM算法(坐标上升算法)

    原文地址:https://www.cnblogs.com/to-creat/p/6075322.html 机器学习十大算法之一:EM算法.能评得上十大之一,让人听起来觉得挺NB的.什么是NB啊,我们一 ...

  5. 图像超分辨-IDN

    本文译自2018CVPR Fast and Accurate Single Image Super-Resolution via Information Distillation Network 代码 ...

  6. Liunx之Centos系统无人值守全自动化安装

    作者:邓聪聪 定制centos6.8自动安装ISO光盘 安装系统为centos6.8 (base server),安装方式为全新安装 使用ext4分区格式 安装前可以交互输入root密码,主机名,分区 ...

  7. 设计模式C++学习笔记之六(Facade门面模式)

      Facade门面模式,也是比较常用的一种模式,基本上所有软件系统中都会用到. GOF 在<设计模式>一书中给出如下定义:为子系统中的一组接口提供一个一致的界面, Facade 模式定义 ...

  8. http和ftp下载的区别

    HTTP和FTP是两种网络传输协议的缩写,FTP是File Transportation Protocol(文件传输协议)的缩写,而HTTP则是Hyper Text Transportation Pr ...

  9. UDP可靠传输那些事

    有空来论坛走走,发现讨论udp可靠传输又热了起来,有人认为udp高效率,有人认为udp丢包重传机制容易控制,还有朋友搞极限测试,当然也有人推销自己的东西,这里写一点我个人的看法. udp可靠传输其实非 ...

  10. linux系统常用运维命令

    目录/文件处理命令 mkdir dirname         创建文件夹 mkdir -p /tmp/a/b         递归创建目录 rm -rf dirname         删除目录及内 ...