上一节,介绍了基于Apache的POI对Excel基本读写操作.一般情况下使用我们使用CellStyle来修改样式,但是那样的话会显得等别麻烦.所有我们可以先自定义模板,然后从模板中读取样式即可.
下面是对模板操作的封装:
package gd.hz.poi.util; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.RichTextString; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; /** * 用于处理Excel写操作 * @author lfd * 2013-11-25 */ public class ExcelTemplate { //开始位置 public final static String TEMPLATE_NAME = "datastart" ; //样式,用于要标志自定义的样式的列. public final static String STYLE = "style" ; //默认样式 public final static String DEFALULT_STYLE = "defaultStyle" ; //序号,确定Excel是否需要样式. public final static String SERNUMS = "sernums" ; private int initRowIndxe ; //初始行 private int initColIndex ; //初始列 private int curRowIndex ; //当前行 private int curColIndex ; //当前列 private int lastRowInex ; //最后一行 private float defaultHeight ; // 默认行高 private int serColIndex ; //序号行. private Workbook workbook = null ; private Sheet sheet = null ; private Row curRow = null ; //当前行 //样式 private Map<Integer,CellStyle> styles = null ; //默认样式 private CellStyle defaultStyle = null ; //使用单例 private static ExcelTemplate excel = new ExcelTemplate() ; private ExcelTemplate() {} public static ExcelTemplate getInstance() { return excel ; } /** * 读取模板(从classpath中) * @param path 模板路径 * @return ExcelTemplate */ public ExcelTemplate readTemplateClassPath(String calsspath) { try { workbook = WorkbookFactory.create(ExcelTemplate.class.getResourceAsStream(calsspath)) ; initTemplate() ; } catch (InvalidFormatException e) { e.printStackTrace(); throw new RuntimeException("读取模板格式有错!请检查.") ; } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("读取模板文件不存在!请检查.") ; } return this ; } /** * 读取模板(从指定路径) * @param path 模板路径 * @return ExcelTemplate */ public ExcelTemplate readTemplatePath(String path) { try { workbook = WorkbookFactory.create(new File(path)) ; initTemplate() ; } catch (InvalidFormatException e) { e.printStackTrace(); throw new RuntimeException("读取模板格式有错!请检查.") ; } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("读取模板文件不存在!请检查.") ; } return this ; } /** * 创建新的一行 */ public void creatNewRow() { //curRowIndex != initRowIndxe : 当前行本身是存在的,所以下移多余. if(lastRowInex > curRowIndex && curRowIndex != initRowIndxe) { sheet.shiftRows(curRowIndex, lastRowInex, 1, true, true) ; //有的模板最后可能是日期或者姓名之类的非数据.所以要移动行. lastRowInex ++ ; } curRow = sheet.createRow(curRowIndex) ; curRow.setHeightInPoints(defaultHeight) ; curRowIndex ++ ; curColIndex = initColIndex ; } public void createNewCol(String value) { Cell cell = curRow.createCell(curColIndex) ; setStyle(cell) ; cell.setCellValue(value) ; curColIndex ++ ; } public void createNewCol(double value) { Cell cell = curRow.createCell(curColIndex) ; setStyle(cell) ; cell.setCellValue(value) ; curColIndex ++ ; } public void createNewCol(boolean value) { Cell cell = curRow.createCell(curColIndex) ; setStyle(cell) ; cell.setCellValue(value) ; curColIndex ++ ; } public void createNewCol(Date value) { Cell cell = curRow.createCell(curColIndex) ; setStyle(cell) ; cell.setCellValue(value) ; curColIndex ++ ; } public void createNewCol(Calendar value) { Cell cell = curRow.createCell(curColIndex) ; setStyle(cell) ; cell.setCellValue(value) ; curColIndex ++ ; } public void createNewCol(RichTextString value) { Cell cell = curRow.createCell(curColIndex) ; setStyle(cell) ; cell.setCellValue(value) ; curColIndex ++ ; } /** * 根据#xxx替换模板中的其它样式. * @param datas 要替换的数据 */ public void replaceFind(Map<String, String> datas) { if(datas == null) return ; for(Row row : sheet) { for(Cell cell : row) { if(cell.getCellType() != Cell.CELL_TYPE_STRING) continue ; String value = cell.getStringCellValue().trim() ; if(value.startsWith("#")) { if(datas.containsKey(value.substring(1))) { cell.setCellValue(datas.get(value.substring(1))) ; } } } } } /** * 插入序号 */ public void insertSer() { int index = 1 ; Row row = null ; Cell cell = null ; for(int i = initRowIndxe; i < curRowIndex; i++) { row = sheet.getRow(i) ; cell = row.createCell(serColIndex) ; setStyle(cell) ; cell.setCellValue(index++) ; } } /** * 输出文件,根据路径 * @param path 路径 */ public void writeToFile(String path) { FileOutputStream fos = null; try { fos = new FileOutputStream(path) ; workbook.write(fos) ; } catch (FileNotFoundException e) { e.printStackTrace(); throw new RuntimeException("找不到文件!请检查.") ; } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("文件输出异常!请检查.") ; } finally { try { if(fos != null) { fos.close() ; fos = null ; } } catch (IOException e) { e.printStackTrace(); } } } /** * 输出文件,根据流输出 * @param stream OutputStream */ public void writeToStream(OutputStream stream) { try { workbook.write(stream) ; } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("文件输出异常!请检查.") ; } finally { try { if(stream != null) { stream.close() ; stream = null ; } } catch (IOException e) { e.printStackTrace(); } } } /** * 初始化模板 */ private void initTemplate() { sheet = workbook.getSheetAt(0) ; styles = new HashMap<Integer, CellStyle>() ; initConfigData() ; lastRowInex = sheet.getLastRowNum() ; } /** * defaultStyles:获得默认样式(如果默认样式没有则使用开始样式) * styles:获取自定义样式 * */ private void initConfigData() { for(Row row : sheet) { for(Cell cell : row) { if(cell.getCellType() != Cell.CELL_TYPE_STRING) continue ; String value = cell.getStringCellValue().trim() ; //获取开始位置,初始化数据 if(TEMPLATE_NAME.equals(value)) { initRowIndxe = cell.getRowIndex() ; initColIndex = cell.getColumnIndex() ; curRowIndex = initRowIndxe ; curColIndex = initColIndex ; defaultHeight = row.getHeightInPoints() ; if(defaultStyle == null) defaultStyle = cell.getCellStyle() ; } //获取defaultStyles,无论如何,当有设置defaultStyles都设置为defaultStyles if(DEFALULT_STYLE.equals(value)) defaultStyle = cell.getCellStyle() ; //获取自定义样式的列 if(STYLE.equals(value)) { styles.put(cell.getColumnIndex(), cell.getCellStyle()) ; } //获取样式所在的列 if(SERNUMS.equals(value)) serColIndex = cell.getColumnIndex() ; } } } /** * 设置样式 * @param cell Cell */ private void setStyle(Cell cell) { //当前列存在自定义样式时使用自定义样式,否则使用默认样式. if(styles.containsKey(curColIndex)) { cell.setCellStyle(styles.get(curColIndex)) ; } else { cell.setCellStyle(defaultStyle) ; } } }
基本原理是获取模板样式,记录自定义样式所在列的列号和样式,然后根据列号输出样式.
样式例子:
@Test public void testExcel() { ExcelTemplate excel = ExcelTemplate.getInstance().readTemplatePath("D:/Project/MAVEN_ANT/Poi_Template/excel/lilys.xls") ; excel.creatNewRow() ; excel.createNewCol("aaa") ; excel.createNewCol("111") ; excel.createNewCol("111") ; excel.createNewCol("111") ; excel.creatNewRow() ; excel.createNewCol("bbb") ; excel.createNewCol("222") ; excel.createNewCol("222") ; excel.createNewCol("222") ; excel.creatNewRow() ; excel.createNewCol("ccc") ; excel.createNewCol("333") ; excel.createNewCol("333") ; excel.createNewCol("333") ; excel.creatNewRow() ; excel.createNewCol("ddd") ; excel.createNewCol("444") ; excel.createNewCol("444") ; excel.createNewCol("444") ; excel.creatNewRow() ; excel.createNewCol("eee") ; excel.createNewCol("555") ; excel.createNewCol("555") ; excel.createNewCol("555") ; Map<String, String> datas = new HashMap<String, String>() ; datas.put("title", "拉斯维加斯") ; datas.put("date", new Date().toString()) ; datas.put("department", "百合科技人事部") ; excel.replaceFind(datas) ; excel.insertSer() ; excel.writeToFile("D:/poi.xls") ; }
下面是例子的源代码(Maven项目):
相关推荐
通过以上步骤,你可以使用Apache POI有效地操作Excel模板,并将数据填充到新生成的文件中。这在报表生成、数据分析、批量导出等方面非常实用。记得在实际项目中,还要处理异常、优化性能,比如使用缓冲流、避免频繁...
Java的Apache POI库是一个强大的工具,用于读取、创建和修改Microsoft Office格式的文件,尤其是Excel(.xlsx)文档。在本示例中,我们将深入探讨如何利用POI库来生成Excel中的图表曲线,这对于数据可视化和报告生成...
本篇文章将深入探讨如何使用Java和Apache POI来实现Excel模板的功能,覆盖了单个传值、单行循环、块循环以及快循环嵌套单行循环等操作。 首先,我们需要导入Apache POI的相关依赖库,如`poi-ooxml`和`poi-ooxml-...
Java 使用Apache POI库操作Excel 2007文件详解 在Java开发中,处理Excel文件是一项常见的任务,特别是对于数据分析、数据导入导出或报表生成等场景。Apache POI是一个流行的开源库,它允许开发者读写Microsoft ...
在“POI java_java excel_poi EXCEL模板”这一标签中,我们可以推测这个项目可能包含了一些使用POI创建Excel模板的方法,这些模板可以用于填充动态数据并生成定制化的报表。 在具体使用POI时,主要涉及以下几个关键...
2. **创建工作簿对象**:使用`WorkbookFactory.create()`方法加载Excel模板文件,创建一个`Workbook`对象,它是Excel文档的顶级容器。 3. **获取工作表**:通过`Workbook`对象的`getSheetAt()`或`getSheet()`方法...
2. **读取模板**:在Java代码中,你需要使用POI的XSSFWorkbook类打开模板文件。通过`OPCPackage.openExisting()`方法读取模板文件,然后使用`WorkbookFactory.create()`方法创建一个Workbook对象。 3. **数据准备**...
创建Excel模板时,可以使用Microsoft Excel本身,设置好样式、公式、图表等。模板中的占位符通常用特定的字符串或者特定单元格的特定值表示,比如“${name}”或“${list}”。 2. **添加Apache POI依赖**: 在项目...
在这个特定的例子中,我们将讨论如何使用POI库基于一个Excel模板文件循环输出数据行,并将结果导出为新的Excel文件。 首先,我们需要理解POI库的基本概念。POI提供了HSSF(Horizontally SpreadSheet Format)和XSSF...
本教程将重点讲解如何使用Apache POI库来读取Excel数据,并基于这些数据批量生成Word文档。Apache POI是一个开源项目,它允许Java开发者处理Microsoft Office格式的文件,如Excel(.xlsx或.xls)和Word(.docx)。 ...
这篇博客"java使用POI Excel模板导出数据"探讨了如何利用POI库在Java中创建Excel模板并填充数据。下面将详细介绍这个过程以及相关知识点。 首先,我们需要理解Apache POI的基本概念。POI是Apache软件基金会的一个...
通过这些jar包,开发者可以方便地读取Excel数据,将其与数据库交互,或者根据需求动态生成复杂的Excel模板。 在使用Apache POI时,有几点需要注意: - 由于POI处理的是二进制或XML格式的文件,因此在处理大量数据时...
在本文中,我们将深入探讨如何使用Java POI库根据已有的Excel模板生成新的Excel文件。 首先,理解“模板”在Excel中的概念非常重要。模板通常包含预设的格式、样式、公式和数据结构,可以作为创建新文件的基础。在...
Java POI下载Excel模板 Excel带有下拉框的模板,并有详细注释,生成exlcel的下拉框,必填项标红,数字栏位防止科学计数法,并设置Excel标题样式
在Java编程中,Apache POI库是一个非常实用的工具,它允许开发者读写Microsoft Office格式的文件,如Word(.doc或.docx)、Excel(.xls或.xlsx)和PowerPoint(.ppt或.pptx)。本篇文章将深入探讨如何利用POI库在...
个人java工具集,含有String list map等,basedao(jdbc的基础操作),excel-poi的模板工具(在模板excel中打标机${key}或 ${list.key}) 直接替换指定标记,保留字体格式,内有excel模板使用说明
### POI Excel 模板读取并导出带公式的Excel文档 #### 一、概述 ...综上所述,通过使用Apache POI库结合Excel模板文件,可以高效地实现批量数据的导入导出,并保持原有的公式计算能力,大大提高了工作效率。
这个过程涉及到对Excel模板的理解、读取、修改以及最终的保存。 首先,理解模板文件是关键。一个.xlsx模板文件实际上是由一系列XML文件组成,存储在ZIP压缩包内,这也就是.xslx文件的本质。模板中的单元格、公式、...
以下是关于使用Java POI进行Excel操作的关键知识点: 1. **Apache POI介绍**: Apache POI是一个开源项目,它提供了API来处理Microsoft的文件格式,如Word(.doc),PowerPoint(.ppt)和Excel(.xls或.xlsx)。在...
在"Java操作Excel之Poi模板导入导出"这个主题中,我们将深入探讨如何使用POI库来处理Excel模板,并进行数据的导入和导出。 首先,了解Excel模板的基本概念。模板通常包含预定义的样式、格式和计算,开发人员可以...