文档章节

POI通过模板导出EXCEL文件

dotleo
 dotleo
发布于 2017/08/14 15:11
字数 1128
阅读 47
收藏 3

  一般的EXCEL导出使用POI先创建一个HSSFWorkbook,然后通过不断创建HSSFRow,HSSFCell后设置单元格内容便可以完成导出。

        这次在项目中需要用到模板,导出的内容包括(1.模板中的内容、样式。2.自己需要新增的内容、样式。),还需要设置单元格的样式,在网上搜了一些blog,完成后记录一下。

        分析这次需求,最关键的就是如何获取到填充了模板的新HSSFWorkbook,如果获取到它,我们可以熟练的往里面添加内容。

File fi = new File("F:/usr/user.xls");
POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(fi));  
HSSFWorkbook wb = new HSSFWorkbook(fs);

        这样便可以获取到我们熟悉的HSSFWorkbook对象了,操作熟悉的HSSFWorkbook对象想必爽歪歪了。这里还有一个需求,就是需要设置一些单元格的样式,这在之前我也没有接触到过,记录下来。

 //生成单元格样式
HSSFCellStyle cellStyle = wb.createCellStyle(); //wb是上一步创建的HSSFWorkbook对象
//设置背景颜色
cellStyle.setFillForegroundColor(HSSFColor.RED.index);
//solid 填充  foreground  前景色
cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

        这样便创建完成了一个单元格的样式,接下来便是在特定的单元格添加样式。

//获取特定的单元格
HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum);  
//设置样式
cell.setCellStyle(cellStyle);  //cellStyle是上一步创建的HSSFCellStyle对象

        如此,整个需求基本完成。对于整个过程中需要用到的其他方法,这里写了一个封装类。

        **  有些方法可能只适用此项目,使用时需要修改。

package com.pole.educate.excel;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.RichTextString;  
/** 
 * 共分为六部完成根据模板导出excel操作:<br/> 
 * 第一步、设置excel模板路径(setSrcPath)<br/> 
 * 第二步、设置要生成excel文件路径(setDesPath)<br/> 
 * 第三步、设置模板中哪个Sheet列(setSheetName)<br/> 
 * 第四步、获取所读取excel模板的对象(getSheet)<br/> 
 * 第五步、设置数据(分为6种类型数据:setCellStrValue、setCellDateValue、setCellDoubleValue、setCellBoolValue、setCellCalendarValue、setCellRichTextStrValue)<br/> 
 * 第六步、完成导出 (exportToNewFile)<br/> 
 *  
 * @author Administrator 
 * 
 */  
public class ExcelWriter {
    POIFSFileSystem fs = null;  
    HSSFWorkbook wb = null;  
    HSSFSheet sheet = null;
    HSSFCellStyle cellStyle = null;
    
    private String srcXlsPath = "";//  excel模板路径  
    private String desXlsPath = "";  // 生成路径
    private String sheetName = "";  

    /** 
     * 第一步、设置excel模板路径 
     * @param srcXlsPaths 
     */  
    public void setSrcPath(String srcXlsPaths) {  
        this.srcXlsPath = srcXlsPaths;  
    }  
  
    /** 
     * 第二步、设置要生成excel文件路径 
     * @param desXlsPaths
     * @throws FileNotFoundException 
     */  
    public void setDesPath(String desXlsPaths) throws FileNotFoundException {  
        this.desXlsPath = desXlsPaths;
    }  
  
    /** 
     * 第三步、设置模板中哪个Sheet列 
     * @param sheetName 
     */  
    public void setSheetName(String sheetName) {  
        this.sheetName = sheetName;  
    }  
  
    /** 
     * 第四步、获取所读取excel模板的对象 
     */  
    public void getSheet() {  
        try {  
            File fi = new File(srcXlsPath);  
            if(!fi.exists()){  
                //System.out.println("模板文件:"+srcXlsPath+"不存在!");  
                return;  
            }  
            fs = new POIFSFileSystem(new FileInputStream(fi));  
            wb = new HSSFWorkbook(fs);
            sheet = wb.getSheet(sheetName); 
            
            //生成单元格样式
            cellStyle = wb.createCellStyle();
            //设置背景颜色
            cellStyle.setFillForegroundColor(HSSFColor.RED.index);
            //solid 填充  foreground  前景色
            cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
            
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    } 
    /**
     *  
     */
    public HSSFRow createRow(int rowIndex) {
    	HSSFRow row = sheet.createRow(rowIndex);
    	return row;
    }
    /**
     *  
     */
    public void createCell(HSSFRow row,int colIndex) {
    	row.createCell(colIndex);
    }
    /** 
     * 第五步、设置单元格的样式 
     * @param rowIndex	行值 
     * @param cellnum	列值 
     */  
    public void setCellStyle(int rowIndex, int cellnum) {  
    	HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum);  
        cell.setCellStyle(cellStyle);
    }
    
    /** 
     * 第五步、设置字符串类型的数据 
     * @param rowIndex	行值 
     * @param cellnum	列值 
     * @param value		字符串类型的数据 
     */  
    public void setCellStrValue(int rowIndex, int cellnum, String value) {
    	if(value != null) {
    		HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum);  
    		cell.setCellValue(value);
    	}
    }  
  
    /** 
     * 第五步、设置日期/时间类型的数据 
     * @param rowIndex	行值 
     * @param cellnum	列值 
     * @param value		日期/时间类型的数据 
     */  
    public void setCellDateValue(int rowIndex, int cellnum, Date value) {  
        HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum);  
        cell.setCellValue(value);  
    }  
  
    /** 
     * 第五步、设置浮点类型的数据 
     * @param rowIndex	行值 
     * @param cellnum	列值 
     * @param value		浮点类型的数据 
     */  
    public void setCellDoubleValue(int rowIndex, int cellnum, double value) {  
        HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum);  
        cell.setCellValue(value);  
    }  
  
    /** 
     * 第五步、设置Bool类型的数据 
     * @param rowIndex	行值 
     * @param cellnum	列值 
     * @param value		Bool类型的数据 
     */  
    public void setCellBoolValue(int rowIndex, int cellnum, boolean value) {  
        HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum);  
        cell.setCellValue(value);  
    }  
  
    /** 
     * 第五步、设置日历类型的数据 
     * @param rowIndex	行值 
     * @param cellnum	列值 
     * @param value		日历类型的数据 
     */  
    public void setCellCalendarValue(int rowIndex, int cellnum, Calendar value) {  
        HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum);  
        cell.setCellValue(value);  
    }  
  
    /** 
     * 第五步、设置富文本字符串类型的数据。可以为同一个单元格内的字符串的不同部分设置不同的字体、颜色、下划线 
     * @param rowIndex	行值 
     * @param cellnum	列值 
     * @param value		富文本字符串类型的数据 
     */  
    public void setCellRichTextStrValue(int rowIndex, int cellnum,  
            RichTextString value) {  
        HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum);  
        cell.setCellValue(value);  
    }  
    
    /** 
     * 第六步、完成导出 
     */  
    public void exportToNewFile() {  
        FileOutputStream out;  
        try {  
            out = new FileOutputStream(desXlsPath);  
            wb.write(out);
            out.close(); 
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
   }  

} 

 

© 著作权归作者所有

dotleo
粉丝 16
博文 51
码字总数 52059
作品 0
天津
程序员
私信 提问
Java基础系列19:使用JXL或者POI生成和解析Excel文件

一 简介 如题所示,当我们需要在Java中解析Excel文件时,可以考虑使用JXL或POI的API来解析。 二者的区别如下: jxl现在基本上没被维护了,最近一次更新时间还是几年前。相反,poi属于Apache开...

pangfc
2016/12/07
0
0
kvn-wang/poi-el

poi-el excel导出与导入神器,poi-el。 poi-el支持强大的excel模板导出功能 poi-el支持方便的excel导入API excel模板导出 使用poi + spEl,支持各种普通模板和复杂模板的导出功能 Quick Star...

kvn-wang
2017/11/01
0
0
紫色枫林/XPOI

XPOI 基于Java POI开源组件,开发更适用于项目开发的开源组件 一、基于特定excel模板,导出excel文档(目前只支持.xls后缀的模板) 版本说明: v1.0:支持单模板excel文件导出 v2.0:执行单或...

紫色枫林
2017/12/09
0
0
EasyPOI 3.1.0,不放假只能发个版本的版本

这次版本修改了错误的拼写可能和之间版本不一致,请大家谨慎升级 升级内容干货还是比较多的 修改Server改为service 修改hanlder改为handler 修复删除带来的宽度问题 导入制定列,导入,解决复杂...

Anotherjueyue
2018/02/13
2.1K
8
快速Office,PDF 开发 工具--EasyPoi

easypoi 功能如同名字easy,主打的功能就是易容,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言(熟悉的表达式语法)...

Anotherjueyue
2014/12/12
32.8K
9

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
5
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
昨天
6
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
7
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部