使用POI来处理Excel和Word文件格式
- 格式:doc
- 大小:211.50 KB
- 文档页数:15
poi教程Poi教程概述:Poi是一款Java库,用于处理Microsoft Office格式文件,如Excel、Word和PowerPoint。
它提供了丰富的API,使开发人员能够读取、写入和修改这些文件。
Poi教程内容:1. 安装Poi库:首先,你需要下载并安装Poi库。
你可以从Apache的官方网站上找到最新版本的Poi库。
安装过程包括将Poi库添加到你的Java项目的构建路径中。
2. 创建Excel文档:使用Poi,你可以创建一个新的Excel文档。
你可以定义工作表、行和单元格,并在单元格中添加数据。
你还可以设置单元格的格式,如字体、颜色和边框。
3. 读取Excel文件:Poi可以读取现有的Excel文件。
你可以打开一个文件并读取工作表、行和单元格中的数据。
你还可以根据需要筛选和处理数据。
4. 写入Excel文件:除了读取数据,Poi还可以将数据写入现有的Excel文件。
你可以创建新的工作表、行和单元格,并在其中插入数据。
你可以使用Poi的API来设置单元格的格式和其他属性。
5. 处理Word和PowerPoint文件:除了处理Excel文件,Poi还可以读取和写入Word和PowerPoint文件。
你可以打开Word文档并访问其中的段落、表格和其他元素。
你还可以修改PowerPoint演示文稿中的幻灯片、文本和图像。
6. 添加图表和图像:Poi提供了创建和修改图表的功能。
你可以使用Poi的API创建各种类型的图表,并在其中添加数据。
此外,你还可以在Excel文件中添加图像,并设置其大小、位置和其他属性。
7. 导出数据:一旦你完成了对Excel、Word或PowerPoint文件的处理,你可以使用Poi将其导出为其他格式,如PDF或HTML。
这使得你可以轻松地共享和打印处理过的文件。
8. 错误处理和异常处理:在使用Poi时,可能会遇到各种错误和异常。
你需要学会如何正确处理这些错误,以确保你的代码能够顺利运行。
poi-tl的循环标签使用方法POI-TL 是一个 Java 库,用于操作 Microsoft Office 的文件格式,如 Word、Excel 和 PowerPoint。
在 POI-TL 中,循环标签(Loop Tag)用于在模板中循环生成内容。
使用循环标签的方法如下:1. 在模板文件中,使用 {%for items as item%} 开始一个循环标签,并以 {%endfor%} 结束。
例如,在 Word 模板中,可以将循环标签放置在表格中的一个单元格中,以便循环生成表格行。
```{%for items as item%}<tr><td>${item.value1}</td><td>${item.value2}</td>...</tr>{%endfor%}```2. 在 Java 代码中,创建一个 POI-TL 文档对象,打开模板文件。
```javaWordTemplate template = new WordTemplate();template.openTemplate("/path/to/template.docx");```3. 使用 `template.build` 方法来处理循环标签。
```javaList<Map<String, Object>> items = new ArrayList<>();// 添加要循环生成的数据Map<String, Object> item1 = new HashMap<>();item1.put("value1", "Value 1");item1.put("value2", "Value 2");Map<String, Object> item2 = new HashMap<>();item2.put("value1", "Value 3");item2.put("value2", "Value 4");items.add(item1);items.add(item2);template.build("items", items);```在这个例子中,我们创建了一个包含两个 Map 对象的 List,每个 Map 对象都包含两个键值对。
JavaPOI操作word⽂档内容、表格⼀、pom<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.0.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>4.0.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.0.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.0.0</version></dependency>⼆、直接上代码word模板中${content} 注意我只有在.docx⽤XWPFDocument才有效2.1/*** 获取document**/XWPFDocument document = null;try {document = new XWPFDocument(inputStream);} catch (IOException ioException) {ioException.printStackTrace();}/*** 替换段落⾥⾯的变量** @param doc 要替换的⽂档* @param params 参数*/private void replaceInPara(XWPFDocument doc, Map<String, String> params) {for (XWPFParagraph para : doc.getParagraphs()) {replaceInPara(para, params);}}/*** 替换段落⾥⾯的变量** @param para 要替换的段落* @param params 参数*/private void replaceInPara(XWPFParagraph para, Map<String, String> params) {List<XWPFRun> runs;Matcher matcher;replaceText(para);//如果para拆分的不对,则⽤这个⽅法修改成正确的if (matcher(para.getParagraphText()).find()) {runs = para.getRuns();for (int i = 0; i < runs.size(); i++) {XWPFRun run = runs.get(i);String runText = run.toString();matcher = matcher(runText);if (matcher.find()) {while ((matcher = matcher(runText)).find()) {runText = matcher.replaceFirst(String.valueOf(params.get(matcher.group(1))));}//直接调⽤XWPFRun的setText()⽅法设置⽂本时,在底层会重新创建⼀个XWPFRun,把⽂本附加在当前⽂本后⾯, para.removeRun(i);para.insertNewRun(i).setText(runText);}}}}/*** 替换⽂本内容* @param para* @return*/private List<XWPFRun> replaceText(XWPFParagraph para) {List<XWPFRun> runs = para.getRuns();String str = "";boolean flag = false;for (int i = 0; i < runs.size(); i++) {XWPFRun run = runs.get(i);String runText = run.toString();if (flag || runText.equals("${")) {str = str + runText;flag = true;para.removeRun(i);if (runText.equals("}")) {flag = false;para.insertNewRun(i).setText(str);str = "";}i--;}}return runs;}2.22.2.1XWPFTable table = document.getTableArray(0);//获取当前表格XWPFTableRow twoRow = table.getRow(2);//获取某⼀⾏XWPFTableRow nextRow = table.insertNewTableRow(3);//插⼊⼀⾏XWPFTableCell firstRowCellOne = firstRow.getCell(0);firstRowCellOne.removeParagraph(0);//删除默认段落,要不然表格内第⼀条为空⾏XWPFParagraph pIO2 =firstRowCellOne.addParagraph();XWPFRun rIO2 = pIO2.createRun();rIO2.setFontFamily("宋体");//字体rIO2.setFontSize(8);//字体⼤⼩rIO2.setBold(true);//是否加粗rIO2.setColor("FF0000");//字体颜⾊rIO2.setText("这是写⼊的内容");//rIO2.addBreak(BreakType.TEXT_WRAPPING);//软换⾏,亲测有效/*** 复制单元格和样式** @param targetRow 要复制的⾏* @param sourceRow 被复制的⾏*/public void createCellsAndCopyStyles(XWPFTableRow targetRow, XWPFTableRow sourceRow) {targetRow.getCtRow().setTrPr(sourceRow.getCtRow().getTrPr());List<XWPFTableCell> tableCells = sourceRow.getTableCells();if (CollectionUtils.isEmpty(tableCells)) {return;}for (XWPFTableCell sourceCell : tableCells) {XWPFTableCell newCell = targetRow.addNewTableCell();newCell.getCTTc().setTcPr(sourceCell.getCTTc().getTcPr());List sourceParagraphs = sourceCell.getParagraphs();if (CollectionUtils.isEmpty(sourceParagraphs)) {continue;}XWPFParagraph sourceParagraph = (XWPFParagraph) sourceParagraphs.get(0);List targetParagraphs = newCell.getParagraphs();if (CollectionUtils.isEmpty(targetParagraphs)) {XWPFParagraph p = newCell.addParagraph();p.getCTP().setPPr(sourceParagraph.getCTP().getPPr());XWPFRun run = p.getRuns().isEmpty() ? p.createRun() : p.getRuns().get(0);run.setFontFamily(sourceParagraph.getRuns().get(0).getFontFamily());} else {XWPFParagraph p = (XWPFParagraph) targetParagraphs.get(0);p.getCTP().setPPr(sourceParagraph.getCTP().getPPr());XWPFRun run = p.getRuns().isEmpty() ? p.createRun() : p.getRuns().get(0);if (sourceParagraph.getRuns().size() > 0) {run.setFontFamily(sourceParagraph.getRuns().get(0).getFontFamily());}}}}#### 2.2.3/*** 合并单元格** @param table 表格对象* @param beginRowIndex 开始⾏索引* @param endRowIndex 结束⾏索引* @param colIndex 合并列索引*/public void mergeCell(XWPFTable table, int beginRowIndex, int endRowIndex, int colIndex) { if (beginRowIndex == endRowIndex || beginRowIndex > endRowIndex) {return;}//合并⾏单元格的第⼀个单元格CTVMerge startMerge = CTVMerge.Factory.newInstance();startMerge.setVal(STMerge.RESTART);//合并⾏单元格的第⼀个单元格之后的单元格CTVMerge endMerge = CTVMerge.Factory.newInstance();endMerge.setVal(STMerge.CONTINUE);table.getRow(beginRowIndex).getCell(colIndex).getCTTc().getTcPr().setVMerge(startMerge); for (int i = beginRowIndex + 1; i <= endRowIndex; i++) {table.getRow(i).getCell(colIndex).getCTTc().getTcPr().setVMerge(endMerge);}}/*** insertRow 在word表格中指定位置插⼊⼀⾏,并将某⼀⾏的样式复制到新增⾏* @param copyrowIndex 需要复制的⾏位置* @param newrowIndex 需要新增⼀⾏的位置* */public static void insertRow(XWPFTable table, int copyrowIndex, int newrowIndex) {// 在表格中指定的位置新增⼀⾏XWPFTableRow targetRow = table.insertNewTableRow(newrowIndex);// 获取需要复制⾏对象XWPFTableRow copyRow = table.getRow(copyrowIndex);//复制⾏对象targetRow.getCtRow().setTrPr(copyRow.getCtRow().getTrPr());//或许需要复制的⾏的列List<XWPFTableCell> copyCells = copyRow.getTableCells();//复制列对象XWPFTableCell targetCell = null;for (int i = 0; i < copyCells.size(); i++) {XWPFTableCell copyCell = copyCells.get(i);targetCell = targetRow.addNewTableCell();targetCell.getCTTc().setTcPr(copyCell.getCTTc().getTcPr());if (copyCell.getParagraphs() != null && copyCell.getParagraphs().size() > 0) {targetCell.getParagraphs().get(0).getCTP().setPPr(copyCell.getParagraphs().get(0).getCTP().getPPr()); if (copyCell.getParagraphs().get(0).getRuns() != null&& copyCell.getParagraphs().get(0).getRuns().size() > 0) {XWPFRun cellR = targetCell.getParagraphs().get(0).createRun();cellR.setBold(copyCell.getParagraphs().get(0).getRuns().get(0).isBold());}}}}/*** 正则匹配字符串** @param str* @return*/private Matcher matcher(String str) {Pattern pattern = pile("\\$\\{(.+?)\\}", Pattern.CASE_INSENSITIVE);Matcher matcher = pattern.matcher(str);return matcher;}。
poi遍历单元格-回复"poi遍历单元格"是指使用POI库中的API来遍历Excel单元格中的数据。
POI(Poor Obfuscation Implementation)是一个用于处理Microsoft Office格式文件的Java API。
它是Apache软件基金会的一个项目,可以通过Java代码操作Excel、Word和PowerPoint等文件格式。
在本文中,我们将逐步解释如何使用POI库来遍历Excel单元格,并提供一些具体的示例代码和解释。
希望通过本文的阐述,您能够对POI的单元格遍历有更深入的理解。
首先,我们需要通过POI库加载Excel文件。
POI库提供了多种方式来加载Excel文件,我们选择使用`XSSFWorkbook`类来加载一个XLSX格式的Excel文件,示例代码如下:FileInputStream fis = new FileInputStream(newFile("example.xlsx"));XSSFWorkbook workbook = new XSSFWorkbook(fis);上述代码中,我们使用`FileInputStream`类来读取文件,并使用`XSSFWorkbook`类来解析和加载Excel文件。
接下来,我们将介绍如何遍历一个工作表中的所有单元格。
首先,我们需要获取一个工作表对象,然后使用`getRow()`和`getCell()`方法来遍历每一个单元格。
以下是一个简单的示例代码:获取第一个工作表XSSFSheet sheet = workbook.getSheetAt(0);遍历每一行for (Row row : sheet) {遍历每一个单元格for (Cell cell : row) {获取单元格的值String cellValue = cell.toString();处理每一个单元格的值System.out.println(cellValue);}}上述代码中,我们使用`getSheetAt()`方法获取第一个工作表对象,然后使用增强型的`for`循环遍历每一行和每一个单元格。
poi 单元格格式-回复POI(Poor Obfuscation Implementation)是一款非常流行的Java库,用于操作Microsoft Office格式的文档,如Excel、Word和PowerPoint。
其中,对于Excel文档来说,POI提供了丰富的API,使得我们可以对Excel 进行读、写和格式化等操作。
本文将详细介绍POI中的单元格格式功能,让读者能够全面了解并灵活运用这一特性。
在Excel中,单元格格式是非常重要的。
它决定了单元格内数据的展示方式和样式。
通过POI,我们可以对单元格进行格式化,包括设置文本样式、数字格式、日期格式、边框样式等。
下面将一步一步介绍如何使用POI 实现单元格格式的设置。
首先,我们需要创建一个新的Excel文档。
可以使用`Workbook`类来创建一个新的工作簿,例如:javaWorkbook workbook = new XSSFWorkbook();Sheet sheet = workbook.createSheet("Sheet1");在POI中,`Workbook`代表整个Excel文档,`Sheet`代表一个工作表(或称为工作表)。
通过`createSheet`方法,我们可以创建一个名为"Sheet1"的工作表。
接下来,我们需要创建一个单元格,并设置其格式。
首先,我们需要获取`CellStyle`对象,用于设置单元格的样式。
可以通过`createCellStyle`方法创建一个新的`CellStyle`对象,例如:javaCellStyle cellStyle = workbook.createCellStyle();然后,我们可以设置单元格的各种格式。
例如,要设置单元格的背景颜色为黄色,可以使用`setFillForegroundColor`方法和`setFillPattern`方法,如下所示:javacellStyle.setFillForegroundColor(IndexedColors.YELLOW.getIndex()) ;cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);在上面的代码中,我们使用了`IndexedColors`枚举类来表示颜色,并使用了`SOLID_FOREGROUND`填充模式。
POI操作Excel⼀、POI概述 Apache POI是Apache软件基⾦会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
结构:HSSF -提供读写Microsoft Excel格式档案的功能。
XSSF -提供读写Microsoft Excel OOXML格式档案的功能。
HWPF -提供读写Microsoft Word格式档案的功能。
HSLF -提供读写Microsoft PowerPoint格式档案的功能。
HDGF -提供读写Microsoft Visio格式档案的功能。
使⽤必须引⼊依赖<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency> 注:3.17版本是⽀持jdk6的最后版本⼆、HSSF概况 HSSF 是Horrible SpreadSheet Format的缩写,通过HSSF,你可以⽤纯Java代码来读取、写⼊、修改Excel⽂件。
HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“⽤户模型”和“事件-⽤户模型”。
三、 POI EXCEL⽂档结构类HSSFWorkbook excel⽂档对象HSSFSheet excel的sheetHSSFRow excel的⾏HSSFCell excel的单元格HSSFFont excel字体HSSFName 名称HSSFDataFormat ⽇期格式HSSFHeader sheet头HSSFFooter sheet尾HSSFCellStyle cell样式HSSFDateUtil ⽇期HSSFPrintSetup 打印HSSFErrorConstants 错误信息表四、EXCEL的读写操作1、读取“区域数据.xls”并储存于list集合中,“区域数据.xls”如下图1public List<Area> importXLS(){23 ArrayList<Area> list = new ArrayList<>();4try {5 //1、获取⽂件输⼊流6 InputStream inputStream = new FileInputStream("/Users/Shared/区域数据.xls");7 //2、获取Excel⼯作簿对象8 HSSFWorkbook workbook = new HSSFWorkbook(inputStream);9 //3、得到Excel⼯作表对象10 HSSFSheet sheetAt = workbook.getSheetAt(0);11//4、循环读取表格数据12 for (Row row : sheetAt) {13 //⾸⾏(即表头)不读取14if (row.getRowNum() == 0) {15continue;16 }17//读取当前⾏中单元格数据,索引从0开始18 String areaNum = row.getCell(0).getStringCellValue();19 String province = row.getCell(1).getStringCellValue();20 String city = row.getCell(2).getStringCellValue();21 String district = row.getCell(3).getStringCellValue();22 String postcode = row.getCell(4).getStringCellValue();2324 Area area = new Area();25 area.setCity(city);26 area.setDistrict(district);27 area.setProvince(province);28 area.setPostCode(postcode);29 list.add(area);30 }31 //5、关闭流32 workbook.close();33 } catch (IOException e) {34 e.printStackTrace();35 }36 return list;37 }2、导出数据到“区域数据.xls”⽂件中,页⾯数据如下图:1public void exportExcel() throws IOException {23 Page<Area> page = areaService.pageQuery(null);4 List<Area> list = page.getContent();56//1.在内存中创建⼀个excel⽂件7 HSSFWorkbook hssfWorkbook = new HSSFWorkbook();8//2.创建⼯作簿9 HSSFSheet sheet = hssfWorkbook.createSheet();10//3.创建标题⾏11 HSSFRow titlerRow = sheet.createRow(0);12 titlerRow.createCell(0).setCellValue("省");13 titlerRow.createCell(1).setCellValue("市");14 titlerRow.createCell(2).setCellValue("区");15 titlerRow.createCell(3).setCellValue("邮编");16 titlerRow.createCell(4).setCellValue("简码");17 titlerRow.createCell(5).setCellValue("城市编码");1819//4.遍历数据,创建数据⾏20for (Area area : list) {21//获取最后⼀⾏的⾏号22int lastRowNum = sheet.getLastRowNum();23 HSSFRow dataRow = sheet.createRow(lastRowNum + 1);24 dataRow.createCell(0).setCellValue(area.getProvince());25 dataRow.createCell(1).setCellValue(area.getCity());26 dataRow.createCell(2).setCellValue(area.getDistrict());27 dataRow.createCell(3).setCellValue(area.getPostcode());28 dataRow.createCell(4).setCellValue(area.getShortcode());29 dataRow.createCell(5).setCellValue(area.getCitycode());30 }31//5.创建⽂件名32 String fileName = "区域数据统计.xls";33//6.获取输出流对象34 HttpServletResponse response = ServletActionContext.getResponse();35 ServletOutputStream outputStream = response.getOutputStream();3637//7.获取mimeType38 ServletContext servletContext = ServletActionContext.getServletContext();39 String mimeType = servletContext.getMimeType(fileName);40//8.获取浏览器信息,对⽂件名进⾏重新编码41 HttpServletRequest request = ServletActionContext.getRequest();42 fileName = FileUtils.filenameEncoding(fileName, request);4344//9.设置信息头45 response.setContentType(mimeType);46 response.setHeader("Content-Disposition","attachment;filename="+fileName);47//10.写出⽂件,关闭流48 hssfWorkbook.write(outputStream);49 hssfWorkbook.close();50 }⼯具类1public class FileUtils {23public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException { 4 String agent = request.getHeader("User-Agent"); //获取浏览器5if (agent.contains("Firefox")) {6 BASE64Encoder base64Encoder = new BASE64Encoder();7 filename = "=?utf-8?B?"8 + base64Encoder.encode(filename.getBytes("utf-8"))9 + "?=";10 } else if(agent.contains("MSIE")) {11 filename = URLEncoder.encode(filename, "utf-8");12 } else if(agent.contains ("Safari")) {13 filename = new String (filename.getBytes ("utf-8"),"ISO8859-1");14 } else {15 filename = URLEncoder.encode(filename, "utf-8");16 }17return filename;18 }19 }写出xls⽂件:五、 EXCEL常⽤操作⽅法1、得到Excel常⽤对象1 POIFSFileSystem fs=newPOIFSFileSystem(new FileInputStream("d:/test.xls")); 2//得到Excel⼯作簿对象3 HSSFWorkbook wb = new HSSFWorkbook(fs);4//得到Excel⼯作表对象5 HSSFSheet sheet = wb.getSheetAt(0);6//得到Excel⼯作表的⾏7 HSSFRow row = sheet.getRow(i);8//得到Excel⼯作表指定⾏的单元格9 HSSFCell cell = row.getCell((short) j);10 cellStyle = cell.getCellStyle();//得到单元格样式2、建⽴Excel常⽤对象1 HSSFWorkbook wb = new HSSFWorkbook();//创建Excel⼯作簿对象2 HSSFSheet sheet = wb.createSheet("new sheet");//创建Excel⼯作表对象3 HSSFRow row = sheet.createRow((short)0); //创建Excel⼯作表的⾏4 cellStyle = wb.createCellStyle();//创建单元格样式5 row.createCell((short)0).setCellStyle(cellStyle); //创建Excel⼯作表指定⾏的单元格6 row.createCell((short)0).setCellValue(1); //设置Excel⼯作表的值3、设置sheet名称和单元格内容1 wb.setSheetName(1, "第⼀张⼯作表",HSSFCell.ENCODING_UTF_16);2 cell.setEncoding((short) 1);3 cell.setCellValue("单元格内容");4、取得sheet的数⽬1 wb.getNumberOfSheets()5、根据index取得sheet对象1 HSSFSheet sheet = wb.getSheetAt(0);6、取得有效的⾏数1int rowcount = sheet.getLastRowNum();7、取得⼀⾏的有效单元格个数1 row.getLastCellNum();8、单元格值类型读写1 cell.setCellType(HSSFCell.CELL_TYPE_STRING); //设置单元格为STRING类型2 cell.getNumericCellValue();//读取为数值类型的单元格内容9、设置列宽、⾏⾼1 sheet.setColumnWidth((short)column,(short)width);2 row.setHeight((short)height);10、添加区域,合并单元格1 Region region = new Region((short)rowFrom,(short)columnFrom,(short)rowTo2 ,(short)columnTo);//合并从第rowFrom⾏columnFrom列3 sheet.addMergedRegion(region);// 到rowTo⾏columnTo的区域4//得到所有区域5 sheet.getNumMergedRegions()11、保存Excel⽂件1 FileOutputStream fileOut = new FileOutputStream(path);2 wb.write(fileOut);12、根据单元格不同属性返回字符串数值1public String getCellStringValue(HSSFCell cell) {2 String cellValue = "";3 switch (cell.getCellType()) {4 case HSSFCell.CELL_TYPE_STRING://字符串类型5 cellValue = cell.getStringCellValue();6 if(cellValue.trim().equals("")||cellValue.trim().length()<=0)7 cellValue=" ";8 break;9 case HSSFCell.CELL_TYPE_NUMERIC: //数值类型10 cellValue = String.valueOf(cell.getNumericCellValue());11 break;12 case HSSFCell.CELL_TYPE_FORMULA: //公式13 cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);14 cellValue = String.valueOf(cell.getNumericCellValue());15 break;16 case HSSFCell.CELL_TYPE_BLANK:17 cellValue=" ";18 break;19 case HSSFCell.CELL_TYPE_BOOLEAN:20 break;21 case HSSFCell.CELL_TYPE_ERROR:22 break;23 default:24 break;25 }26 return cellValue;27 }13、常⽤单元格边框格式1 HSSFCellStyle style = wb.createCellStyle();2 style.setBorderBottom(HSSFCellStyle.BORDER_DOTTED);//下边框3 style.setBorderLeft(HSSFCellStyle.BORDER_DOTTED);//左边框4 style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框5 style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框14、设置字体和内容位置1 HSSFFont f = wb.createFont();2 f.setFontHeightInPoints((short) 11);//字号3 f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);//加粗4 style.setFont(f);5 style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//左右居中6 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//上下居中7 style.setRotation(short rotation);//单元格内容的旋转的⾓度8 HSSFDataFormat df = wb.createDataFormat();9 style1.setDataFormat(df.getFormat("0.00%"));//设置单元格数据格式10 cell.setCellFormula(string);//给单元格设公式11 style.setRotation(short rotation);//单元格内容的旋转的⾓度15、插⼊图⽚1//先把读进来的图⽚放到⼀个ByteArrayOutputStream中,以便产⽣ByteArray2 ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();3 BufferedImage bufferImg = ImageIO.read(new File("ok.jpg"));4 ImageIO.write(bufferImg,"jpg",byteArrayOut);5//读进⼀个excel模版6 FileInputStream fos = new FileInputStream(filePathName+"/stencil.xlt");7 fs = new POIFSFileSystem(fos);8//创建⼀个⼯作薄9 HSSFWorkbook wb = new HSSFWorkbook(fs);10 HSSFSheet sheet = wb.getSheetAt(0);11 HSSFPatriarch patriarch = sheet.createDrawingPatriarch();12 HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,1023,255,(short) 0,0,(short)10,10);13 patriarch.createPicture(anchor , wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));16、调整⼯作表位置1 HSSFWorkbook wb = new HSSFWorkbook();2 HSSFSheet sheet = wb.createSheet("format sheet");3 HSSFPrintSetup ps = sheet.getPrintSetup();4 sheet.setAutobreaks(true);5 ps.setFitHeight((short)1);6 ps.setFitWidth((short)1);。
// 文件二进制输入流private InputStream is = null;// 当前的Sheetprivate int currSheet;// 当前位置private int currPosition;// Sheet数量private int numOfSheets;// HSSFWorkbookHSSFWorkbook workbook = null;// 设置Cell之间以空格分割private static String EXCEL_LINE_DELIMITER = " ";// 设置最大列数private static int MAX_EXCEL_COLUMNS = 64;// 构造函数创建一个ExcelReaderpublic ExcelReader(String inputfile) throws IOException, Exception { // 判断参数是否为空或没有意义if (inputfile == null || inputfile.trim().equals("")) {throw new IOException("no input file specified");}// 取得文件名的后缀名赋值给filetypethis.filetype = inputfile.substring(stIndexOf(".") + 1);// 设置开始行为0currPosition = 0;// 设置当前位置为0currSheet = 0;// 创建文件输入流is = new FileInputStream(inputfile);// 判断文件格式if (filetype.equalsIgnoreCase("txt")) {// 如果是txt则直接创建BufferedReader读取reader = new BufferedReader(new InputStreamReader(is));}else if (filetype.equalsIgnoreCase("xls")) {// 如果是Excel文件则创建HSSFWorkbook读取workbook = new HSSFWorkbook(is);// 设置Sheet数numOfSheets = workbook.getNumberOfSheets();}else {throw new Exception("File Type Not Supported");}}// 函数readLine读取文件的一行public String readLine() throws IOException {// 如果是txt文件则通过reader读取if (filetype.equalsIgnoreCase("txt")) {String str = reader.readLine();// 空行则略去,直接读取下一行while (str.trim().equals("")) {str = reader.readLine();}return str;}// 如果是XLS文件则通过POI提供的API读取文件else if (filetype.equalsIgnoreCase("xls")) {// 根据currSheet值获得当前的sheetHSSFSheet sheet = workbook.getSheetAt(currSheet);// 判断当前行是否到但前Sheet的结尾if (currPosition > sheet.getLastRowNum()) {// 当前行位置清零currPosition = 0;// 判断是否还有Sheetwhile (currSheet != numOfSheets - 1) {// 得到下一张Sheetsheet = workbook.getSheetAt(currSheet + 1);// 当前行数是否已经到达文件末尾if (currPosition == sheet.getLastRowNum()) {// 当前Sheet指向下一张SheetcurrSheet++;continue;} else {// 获取当前行数int row = currPosition;currPosition++;// 读取当前行数据return getLine(sheet, row);}}return null;}// 获取当前行数int row = currPosition;currPosition++;// 读取当前行数据return getLine(sheet, row);}return null;}// 函数getLine返回Sheet的一行数据private String getLine(HSSFSheet sheet, int row) {// 根据行数取得Sheet的一行HSSFRow rowline = sheet.getRow(row);// 创建字符创缓冲区StringBuffer buffer = new StringBuffer();// 获取当前行的列数int filledColumns = rowline.getLastCellNum(); HSSFCell cell = null;// 循环遍历所有列for (int i = 0; i < filledColumns; i++) {// 取得当前Cellcell = rowline.getCell((short) i);String cellvalue = null;if (cell != null) {// 判断当前Cell的Typeswitch (cell.getCellType()) {// 如果当前Cell的Type为NUMERICcase HSSFCell.CELL_TYPE_NUMERIC: {// 判断当前的cell是否为Dateif (HSSFDateUtil.isCellDateFormatted(cell)) {// 如果是Date类型则,取得该Cell的Date值Date date = cell.getDateCellValue();// 把Date转换成本地格式的字符串cellvalue = cell.getDateCellValue().toLocaleString();}// 如果是纯数字else {// 取得当前Cell的数值Integer num = new Integer((int) cell.getNumericCellValue());cellvalue = String.valueOf(num);}break;}// 如果当前Cell的Type为STRINcase HSSFCell.CELL_TYPE_STRING:// 取得当前的Cell字符串cellvalue = cell.getStringCellValue().replaceAll("'", "''");break;// 默认的Cell值default:cellvalue = " ";}} else {cellvalue = "";}// 在每个字段之间插入分割符buffer.append(cellvalue).append(EXCEL_LINE_DELIMITER);}// 以字符串返回该行的数据return buffer.toString();}// close函数执行流的关闭操作public void close() {// 如果is不为空,则关闭InputSteam文件输入流if (is != null) {try {is.close();} catch (IOException e) {is = null;}}// 如果reader不为空则关闭BufferedReader文件输入流if (reader != null) {try {reader.close();} catch (IOException e) {reader = null;}}}}7.3.2 ExcelReader的运行效果下面创建一个main函数,用来测试上面的ExcelReader类,代码如下。
利⽤POI读取word、Excel⽂件的最佳实践教程前⾔是 Apache 旗下⼀款读写微软家⽂档声名显赫的类库。
应该很多⼈在做报表的导出,或者创建 word ⽂档以及读取之类的都是⽤过 POI。
POI 也的确对于这些操作带来很⼤的便利性。
我最近做的⼀个⼯具就是读取计算机中的 word 以及 excel ⽂件。
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格式档案的功能。
下⾯就word和excel两⽅⾯讲解以下遇到的⼀些坑:word 篇对于 word ⽂件,我需要的就是提取⽂件中正⽂的⽂字。
所以可以创建⼀个⽅法来读取 doc 或者 docx ⽂件:private static String readDoc(String filePath, InputStream is) {String text= "";try {if (filePath.endsWith("doc")) {WordExtractor ex = new WordExtractor(is);text = ex.getText();ex.close();is.close();} else if(filePath.endsWith("docx")) {XWPFDocument doc = new XWPFDocument(is);XWPFWordExtractor extractor = new XWPFWordExtractor(doc);text = extractor.getText();extractor.close();is.close();}} catch (Exception e) {logger.error(filePath, e);} finally {if (is != null) {is.close();}}return text;}理论上来说,这段代码应该对于读取⼤多数 doc 或者 docx ⽂件都是有效的。
使用POI解析(txt,doc,docx,xls,xlsx)文件方法总结第一篇:使用POI解析(txt,doc,docx,xls,xlsx)文件方法总结本人最近写了用POI解析txt,doc,docx,xls,xlsx等五个格式的文件,整理一下:可能写的不是很简单,但是可用。
最近上传文件,解析文件,我天天都在写,写的头都大了。
所有整理一下主要的核心的代码,即助人为乐,也给自己留个备份。
呵呵欢迎参考首先需要引用jar包:这些jar包网上都是可以找的到的1、首先要先读取到文件,String targetDirectory = ServletActionContext.getServletContext().getRealPath(“/wenjia n”);//获取路径这是获取服务器中wenjian这个文件夹下的所有文件。
//读取指定文件夹下的所有文件名称File file=new File(targetDirectory);String test[];test=file.list();所有的文件名称都在这个list中,用循环可以得到文件的后缀名for(int i=0;iFile f =new File(test[i]);String fileName=f.getName();String prefix=fileName.substring(stIndexOf(“.”)+1);//获取文件后缀名FileInputStream fis = new FileInputStream(targetDir ectory+“/”+test[i]);String fis2 = targetDirectory+“/”+test[i];不同的文件类型,使用不同的解析方法。
简单的代码如下:if(“doc”.equals(prefix)){WordExtractor wordExtractor;try {FileInputStream file = newFileInputStream(path);wordExtractor = new WordExtractor(file);String[] paragraph = for(int j=0;j}}} }ss += paragraph[j].toString();} catch(Exception e){ // TODO Auto-generated catch block e.printStackTrace();if(“docx”.equals(prefix)){ try {} XWPFDocument xwdoc = new XWPFDocument(POIXMLDocument.openPackage(path));POIXMLTextExtractor ex = new XWPFWordExtractor(xwdoc);ss = ex.getText().trim();// TODO: handle exception e.printStackTrace();} catch(Exception e){ if(“xls”.equals(prefix)){ HSSFWorkbook hssfWorkbook = new HSSFWorkbook(fis);//获得第一个工作表SheetHSSFSheet hssfSheet = hssfWorkbook.getSheetAt(0);//获得第一行RowHSSFRow hssfRow = hssfSheet.getRow(0);//用StringBuffer得到Excel表格一行的内容并用逗号分隔StringBuffer sb = new StringBuffer();for(int p=0;pXSSFSheet xssfSheet = xssfWorkbook.getSheetAt(0);// 循环行RowXSSFRow xssfRow = xssfSheet.getRow(0);// 循环列Cell//用StringBuffer得到Excel表格一行的内容并用逗号分隔StringBuffer sbs = new StringBuffer();for(int cellNum = 0;cellNum < xssfRow.getLastCellNum();cellNum++){ XSSFCell xssfCell = xssfRow.getCell(cellNum);sbs.append(xssfCell);int fc = xssfRow.getLastCellNum()-1;if(cellNum!=fc){ if(“xlsx”.equals(prefix)){ sbs.append(biaoshi); } } str = sbs.toString();list.add(str);} if(“txt”.equals(prefix)){这五种方法都是可行的,本人亲自测试过,而且自己也是这么用的,} BufferedReader reader;try {} reader = new BufferedReader(new FileReader(path));//reader.readLine();while(reader.ready()){ ss += reader.readLine();}reader.close();// TODO Auto-generated catch block e.printStackTrace();}catch(Exception e){第二篇:正畸历年大题总结LS名解Indidividualnormal occlusion个别正常合凡轻微的错颌畸形,对于生理过程无大妨碍者,都可列入正常范畴。
使⽤POI解析ExcelExcel作为⼀种常⽤的数据存储格式,在很多项⽬中都会有相应的导⼊导出的功能。
这篇⽂章会介绍如何使⽤Java操作Excel,以及如何解决⼤⽂件读写时内存溢出的问题。
1、OpenXML标准Word、Excel、PPT是Office办公套件中最常⽤的三个组件。
早期的Office套件使⽤⼆进制格式,这⾥⾯包括以.doc、.xls、.ppt为后缀的⽂件;直到07这个划时代的版本将基于XML的压缩格式作为默认⽂件格式,也就是相应以.docx、.xlsx、.pptx为后缀的⽂件。
这个结合了XML与Zip压缩技术的新⽂件格式使⽤的是OpenXML标准。
微软从2000年开始酝酿这项技术标准,到2006年申请成为ECMA-376,然后在Office2007中⽤作默认的⽂件格式,再到08年成为了ISO / IEC 29500国际标准,后续每两三年就会发布⼀个新版本。
Office的⼀路凯歌⽆不彰显微软雄厚的实⼒。
所以说三流公司做产品,⼆流公司做平台,⼀流公司定标准。
微软的官⽅⽂档中详细介绍了WordprocessingML(Word)、SpreadsheetML(Excel)、PresentationML(PPT)三个标准,这⾥主要介绍Excel的部分内容。
⾸先Excel⼏个最基础的概念:⼀个Excel就是⼀个⼯作簿(Workbook)⼀个Sheet就是⼀张表格⼀个Workbook可以包含多个Sheet每⼀⾏Row的每⼀列就是⼀个单元格(Cell)因为07版后的.xlsx本质上就是⼀个压缩包,我们完全可以⽤解压⼯具打开它。
⼀个基础的Excel解压之后更典型的Excel还包括:数字、⽂本、公式、图表(Chart)、普通列表(Table)、数据透视表(Pivot Table)等内容。
Excel远⽐我们想象的复杂2、使⽤POI操作ExcelJava领域最常见的两个操作Excel的⼯具库分别是和Apache的。
// 文件二进制输入流private InputStream is = null;// 当前的Sheetprivate int currSheet;// 当前位置private int currPosition;// Sheet数量private int numOfSheets;// HSSFWorkbookHSSFWorkbook workbook = null;// 设置Cell之间以空格分割private static String EXCEL_LINE_DELIMITER = " ";// 设置最大列数private static int MAX_EXCEL_COLUMNS = 64;// 构造函数创建一个ExcelReaderpublic ExcelReader(String inputfile) throws IOException, Exception { // 判断参数是否为空或没有意义if (inputfile == null || inputfile.trim().equals("")) {throw new IOException("no input file specified");}// 取得文件名的后缀名赋值给filetypethis.filetype = inputfile.substring(stIndexOf(".") + 1);// 设置开始行为0currPosition = 0;// 设置当前位置为0currSheet = 0;// 创建文件输入流is = new FileInputStream(inputfile);// 判断文件格式if (filetype.equalsIgnoreCase("txt")) {// 如果是txt则直接创建BufferedReader读取reader = new BufferedReader(new InputStreamReader(is));}else if (filetype.equalsIgnoreCase("xls")) {// 如果是Excel文件则创建HSSFWorkbook读取workbook = new HSSFWorkbook(is);// 设置Sheet数numOfSheets = workbook.getNumberOfSheets();}else {throw new Exception("File Type Not Supported");}}// 函数readLine读取文件的一行public String readLine() throws IOException {// 如果是txt文件则通过reader读取if (filetype.equalsIgnoreCase("txt")) {String str = reader.readLine();// 空行则略去,直接读取下一行while (str.trim().equals("")) {str = reader.readLine();}return str;}// 如果是XLS文件则通过POI提供的API读取文件else if (filetype.equalsIgnoreCase("xls")) {// 根据currSheet值获得当前的sheetHSSFSheet sheet = workbook.getSheetAt(currSheet);// 判断当前行是否到但前Sheet的结尾if (currPosition > sheet.getLastRowNum()) {// 当前行位置清零currPosition = 0;// 判断是否还有Sheetwhile (currSheet != numOfSheets - 1) {// 得到下一张Sheetsheet = workbook.getSheetAt(currSheet + 1);// 当前行数是否已经到达文件末尾if (currPosition == sheet.getLastRowNum()) {// 当前Sheet指向下一张SheetcurrSheet++;continue;} else {// 获取当前行数int row = currPosition;currPosition++;// 读取当前行数据return getLine(sheet, row);}}return null;}// 获取当前行数int row = currPosition;currPosition++;// 读取当前行数据return getLine(sheet, row);}return null;}// 函数getLine返回Sheet的一行数据private String getLine(HSSFSheet sheet, int row) {// 根据行数取得Sheet的一行HSSFRow rowline = sheet.getRow(row);// 创建字符创缓冲区StringBuffer buffer = new StringBuffer();// 获取当前行的列数int filledColumns = rowline.getLastCellNum(); HSSFCell cell = null;// 循环遍历所有列for (int i = 0; i < filledColumns; i++) {// 取得当前Cellcell = rowline.getCell((short) i);String cellvalue = null;if (cell != null) {// 判断当前Cell的Typeswitch (cell.getCellType()) {// 如果当前Cell的Type为NUMERICcase HSSFCell.CELL_TYPE_NUMERIC: {// 判断当前的cell是否为Dateif (HSSFDateUtil.isCellDateFormatted(cell)) {// 如果是Date类型则,取得该Cell的Date值Date date = cell.getDateCellValue();// 把Date转换成本地格式的字符串cellvalue = cell.getDateCellValue().toLocaleString();}// 如果是纯数字else {// 取得当前Cell的数值Integer num = new Integer((int) cell.getNumericCellValue());cellvalue = String.valueOf(num);}break;}// 如果当前Cell的Type为STRINcase HSSFCell.CELL_TYPE_STRING:// 取得当前的Cell字符串cellvalue = cell.getStringCellValue().replaceAll("'", "''");break;// 默认的Cell值default:cellvalue = " ";}} else {cellvalue = "";}// 在每个字段之间插入分割符buffer.append(cellvalue).append(EXCEL_LINE_DELIMITER);}// 以字符串返回该行的数据return buffer.toString();}// close函数执行流的关闭操作public void close() {// 如果is不为空,则关闭InputSteam文件输入流if (is != null) {try {is.close();} catch (IOException e) {is = null;}}// 如果reader不为空则关闭BufferedReader文件输入流if (reader != null) {try {reader.close();} catch (IOException e) {reader = null;}}}}7.3.2 ExcelReader的运行效果下面创建一个main函数,用来测试上面的ExcelReader类,代码如下。
代码7.7public static void main(String[] args) {try{ExcelReader er=new ExcelReader("c:\\xp.xls");String line=er.readLine();while(line != null){System.out.println(line);line=er.readLine();}er.close();}catch(Exception e){e.printStackTrace();}}main函数先创建一个ExcelReader类,然后调用它提供的接口readLine,对XL S文件进行读取,打印到控制台,处理前的XLS文件如图7-12所示。
图7-12 处理前的XLS文件内容运行main函数进行内容提取后,Eclipse的控制台输出如图7-13所示。
图7-13 输出结果可以看到,Excel文件中的内容已经被成功的输出了出来。
7.3.3 POI中Excel文件Cell的类型需要注意的一点是,所创建的Excel必须是在Microsoft Excel 97到Excel XP 的版本上的,如果在Excel 2003中创建文件后,在使用POI进行解析时,可能会出现问题。
它会把Date类型当作自定义类型。
POI目前只提供对Microsoft Excel XP以下的版本的支持,在以后的版本中,希望会提供对Microsoft Exce l 2003更好的支持。
7.3.4 对Word的处理类除了支持对Excel文件的读取外,POI还提供对Word的DOC格式文件的读取。
但在它的发行版本中没有发布对Word支持的模块,需要另外下载一个POI的扩展的Jar包。
用户可以到/maven2/org/textmining/tm -extractors/0.4/下载,本书采用的是tm-extractors-0.4_zip。
下载后,把该包加入工程的Build Path中,然后在ch7.poi包下新建一个类Wo rdReader,该类提供一个静态方法readDoc,读取一个DOC文件并返回文本。