POI如何使用已有Excel作为模板二三事

简介:
  • 关于POI

POI是Apache的一个开源项目,起初的目标是允许用户使用java代码来对Excel进行操作,发展到今天POI本身支持的范围已经逐步扩展到对Microsoft Office主要产品,包括:Excel\Word\PPT\Visio的全面支持,目前稳定版本为3.7,开发版本为3.8。

  • 应用场景

本文仅对项目中遇到的,使用已有Excel作为模板的场景来进行描述。

  • 代码示例

public void demo(){ 
        try {

            // 先读取模板 
            POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream( 
                    "c://demo_template.xls")); 
            
            // 基于模板创建workbook 
            HSSFWorkbook workbook = new HSSFWorkbook(fs);

            // 如果模板存在多页的话可以分别取到 
            HSSFSheet sheet_1st = workbook.getSheetAt(0); 
            HSSFSheet sheet_2nd = workbook.getSheetAt(1); 
            
            // 第一页,第一行 
            HSSFRow row = sheet_1st.getRow(0); 
            
            // 取第一个单元格 
            HSSFCell cell = row.getCell(0); 
            
            // 获取单元格字符串值 
            String cellValue = cell.getStringCellValue(); 
            
            // 设置单元格的值 
            cell.setCellValue("demo"); 
            
            // 设置单元格的样式 
            HSSFCellStyle cellStyle  =  workbook.createCellStyle();

            cell.setCellStyle(cellStyle); 
            
            // 使用公式设置文档内超链接 
            cell.setCellFormula(    "HYPERLINK(\"#内容!A1\", \"demo\")"); 
            
            // 使用HSSFHyperlink对象设置URL超链接 
            HSSFHyperlink link = new HSSFHyperlin(HSSFHyperlink.LINK_URL); 
            link.setAddress("http://www.163.com");        
            cell.setHyperlink(link); 
            
            String path = "c://demo.xls"; 
            // 输出Excel 
            FileOutputStream stream  =   new  FileOutputStream(path); 
            workbook.write(stream); 
            
            stream.flush(); 
            stream.close();

        } catch (FileNotFoundException e) { 
            e.printStackTrace(); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
    }

  • 特别注意

          1. POI读取空行空格问题

 POI对空行或空格是不做处理的,如果Excel模板中第一行和第三行有数据的话,下面的代码:

HSSFRow row = sheet_1st.getRow(1);

取到的是第三行。如果想对第二行进行操作时,需要先创建一行:

HSSFRow row_2nd = sheet_2nd.createRow(1);

同样,单元格的规则也是一样,通过

row.getCell(index)方法未必是想要的单元格,在使用Excel模板时要特别注意。

2. CellStyle优化

同样的CellStyle在workbook中的存在缓存的,具有同样格式的单元格只要复用一份CellStyle即可,不要对每个单元格都重新创建CellStyle实例。

 

本文转自william_xu 51CTO博客,原文链接:http://blog.51cto.com/williamx/735377,如需转载请自行联系原作者

相关文章
|
1月前
|
easyexcel Java 测试技术
读取Excel还用POI?试试这款开源工具EasyExcel
读取Excel还用POI?试试这款开源工具EasyExcel
54 0
|
2月前
|
API
Poi 中文API文档 「40种操作 Excel文件的姿势」
Poi 中文API文档 「40种操作 Excel文件的姿势」
116 0
|
2月前
|
Java
POI上传excel的java后台逻辑
POI上传excel的java后台逻辑
|
2月前
|
Java
使用POI导出Excel
使用POI导出Excel
|
3月前
|
缓存 Java 关系型数据库
Java使用POI操作Excel
Java使用POI操作Excel
34 0
|
4月前
|
Java
Java 读取 Excel 模板,将数据填入Excel表格,后转换为PDF文件(实用)
Java 读取 Excel 模板,将数据填入Excel表格,后转换为PDF文件(实用)
99 0
|
4月前
|
XML 存储 Java
Apache POI 实现用Java操作Excel完成读写操作
Apache POI 实现用Java操作Excel完成读写操作
|
4月前
POI(excel)中表格(单元格)样式应用实践总结
POI(excel)中表格(单元格)样式应用实践总结
39 0
|
21天前
|
SQL 缓存 easyexcel
面试官问10W 行级别数据的 Excel 导入如何10秒处理
面试官问10W 行级别数据的 Excel 导入如何10秒处理
49 0
|
1月前
|
安全 Java 数据库连接
jdbc解析excel文件,批量插入数据至库中
jdbc解析excel文件,批量插入数据至库中
21 0