java操作office和pdf文件java读取word,excel和pdf文档内容

在平常应用程序中,对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. }
时间: 2024-08-24 18:30:30

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

怎么把PDF文件在线转换成EXCEL

怎么把PDF文件在线转换成EXCEL,PDF文件凭借着良好的视觉阅读性和广泛的通用性被广大用户接受,然而有的时候我们需要修改其内部的EXCEL表格,PDF又不可以直接被编辑,那如何解决这一问题的呢,请看下方步骤讲解.第一步.打开浏览器进入百度首页,搜索迅捷PDF在线转换器.第二步.进入工具页首页后,在导航栏中找到文档转换.第三步.点击文档转换,在下拉框中选择PDF转Excel.第四步.点击选择文件,弹出文件框,将需要转换的PDF文件添加.第五步.设置需要转换的格式页码等参数,点击开始转换按钮.第

Java程序员从笨鸟到菜鸟之(一百零三)java操作office和pdf文件(一)java读取word,excel和pd

在平常应用程序中,对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.ziph

java读取WORD/EXCEL模板转换生成新WORD/EXCEL文档

原文:java读取WORD/EXCEL模板转换生成新WORD/EXCEL文档 代码下载地址:http://www.zuidaima.com/share/1550463239670784.htm 可以通过预先设置指定的excel和word模板,通过替换文档里面指定的标志来生成新的excel和word文档.excel的部分只是实现了简单的方法.word部分可以支持word2003和word2007格式.建议word使用07及其以上. 其实excel部分标签和jstl很像,而且支持循环等.word就支

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

在使用lucent检索文档时,必须先为各文档创建索引.索引的创建即读出文档信息(如文档名称.上传时间.文档内容等),然后再经过分词建索引写入到索引文件里.这里主要是总结下读取各类文档内容这一步. 一.之前做过一个小工具也涉及到读取word和excel内容,采用的是com组件的方式来读取.即导入COM库,引入命名空间(using Microsoft.Office.Interop.Word;using Microsoft.Office.Interop.Excel;),然后读代码如下: 读取word

怎么手动把pdf文件转换成word

怎么手动把pdf文件转换成word 刚上大学的时候以为毕业论文很好写,就相当于写作文一样.四年过去了,当我面对这5000字的 毕业论文时,感觉就不那么简单了.索性直接从网上搜索资料,再进行改写吧.方法倒是好的.可是谁料网上的资料大部分都是pdf格式的,不能进行行编辑.同 学告诉我只能将它转换成word格式再编辑.可是怎么将pdf转换成word文字? 方法一:用Office 2003中的Microsoft Office Document Imaging组件把PDF文件转换成word,也就是用wor

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

Atitit.office word  excel  ppt pdf 的web在线预览方案与html转换方案 attilax 总结 1. office word  excel pdf 的web预览要求1 1.1. 显示效果要好1 1.2. 可以自定义显示界面1 1.3. 不需要控件,兼容性好1 1.4. 支持编辑操作1 2. 纯html预览解决之道(自由的格式)1 3. 转换swf flash方案2 4. 转换pdf方式..更多的浏览器已经直接支持pdf格式查看2 5. 控件方式2 6. Hyb

简单快速有效地将PDF文件转换成Word

写论文的时候需要大段地引用知网下载下来的前人论文内容,但是数据库的论文下载下来大部分几乎都是pdf格式的,所以这成了让人很头疼的事情,后来经过方法的寻找,我发现了一款很有用的转换器软件,解决了我的一大烦恼. 这款软件名字叫做迅捷pdf转换器,是一款最快捷的PDF文件转换到Word文档工具,它可以帮助用户生成一个与原PDF文件一模一样的Word格式文档,而这个文档完好地保留了原有排版及所有元素.如文字.图片.链接.图表.表格.样式等都可以很好的保留在Word文档中,接下来用户就可以很方便的修改或重

如何将PDF文件转换成word文档格式

以前看一些视频的时候,视频文件会有很多种格式,因为格式播放问题经常会需要转换这些格式.于此相同,现在的一些文档格式的类型也有很多种,有时为了方便应用也会需要转换成不同的文档格式,如何将PDF文档转换成word就是常需要应用到的. 很多文档格式都可以保存输出成PDF文件格式,相同的,将PDF格式也可以转换成其他的文档类型.例如我们常见的一些word,ppt,Excel以及图片文件.并且大部分文档之间也可以进行格式转换.?a.文档格式的转换也是有对应的转换工具的.可以先安装PDF转换器并打开.把PD

pdf转换成word转换器免费版是一款功能强大好用的pdf文件转换成word文件的软件

pdf转换成word转换器免费版是一款功能强大好用的pdf文件转换成word文件的软件,界面简单,功能稳定,支持批量转换,操作起来非常方便,支持多种流行文档格式之间转换.完美支持pdf文件转换成word文档,转换后可再次编辑,支持图文混合排版,支持表格转换,支持批量转换,操作简单.pdf转换成word转换器免费不限页数可以很好的转换原来pdf文档中的文字.图片.表格 .超链接.布局,使其转换成的word文档排版与原有文档一样.pdf转换成word转换器是一款小巧.方便且免费的pdf转Word工具