因为最近用报表导出比较多,所有就提成了一个工具类,本工具类使用的场景为  根据提供的模板来导出Excel报表

并且可根据提供的模板Sheet页进行复制 从而实现多个Sheet页的需求,

使用本工具类时,如果需求是每个Sheet页中的数据都不一致,但是表格样式和模板都一样

那么只需要在实际情况中根据 sql 来查询要添加的数据源 (只需更改数据源即可)

采用的技术为 POI 导出,因为类的缘故,目前只支持2003版本的Excel.

使用前请先下载相应jar包!

后期有时间的话会进行进一步完善,初次写工具类,若有不完善的地方还请包涵!

先看看模板样式和运行结果,然后直接上代码

这是Excel的模板样式

这是导出结果

具体实现看demo

package com.sgcc.xyz.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.Map; import javax.servlet.http.HttpServletResponse; 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.hssf.util.Region;
import org.apache.poi.poifs.filesystem.POIFSFileSystem; import com.sgcc.uap.persistence.impl.HibernateDaoImpl; /**
* 报表导出工具类
*
* @author JYLiu
@巴黎的雨季
本工具是根据POI对Excel2003进行报表导出 本工具类可根据模板进行Excel的导出
* 并且可根据提供的模板Sheet页进行复制 从而实现多个Sheet页的需求
* 使用本工具类时,如果需求是每个Sheet页中的数据都不一致,但是表格样式和模板都一样
* 那么只需要在实际情况中根据 sql 来查询要添加的数据源 (只需更改数据源即可) */
public class ExcelUtil { /**
* 根据模板导出报表,可导出多个Sheet页
*
* @param 导出的Excel文件名
* @param 模板路径 (全路径)
* @param 数据源
* @param 返回请求
* @param 生成的Sheet页的名称集合
* @param 数据源中Map集合的key值 (key值对应的value值顺序要列名顺序一致)
* @param 开始 循环写入数据 的行数(从第几行开始写入数据)
*/
public static void ExcelByModel(String ExcelName, String ModelURl, List<Map<String, String>> dataSource,
HttpServletResponse response, String[] sheetNames, String[] keyNames, int rowNum) throws Exception { // 设置导出Excel报表的导出形式
response.setContentType("application/vnd.ms-excel");
// 设置导出Excel报表的响应文件名
String fileName = new String(ExcelName.getBytes("utf-8"), "ISO-8859-1");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xls");
// 创建一个输出流
OutputStream fileOut = response.getOutputStream();
// 读取模板文件路径
File file = new File(ModelURl);
FileInputStream fins = new FileInputStream(file);
POIFSFileSystem fs = new POIFSFileSystem(fins);
// 读取Excel模板
HSSFWorkbook wb = new HSSFWorkbook(fs); // 设置边框样式
HSSFCellStyle style = wb.createCellStyle();
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
// 设置边框样式的颜色
style.setBottomBorderColor(HSSFColor.BLACK.index);
style.setLeftBorderColor(HSSFColor.BLACK.index);
style.setRightBorderColor(HSSFColor.BLACK.index);
style.setTopBorderColor(HSSFColor.BLACK.index); // 模板页
HSSFSheet sheetModel = null;
// 新建的Sheet页
HSSFSheet newSheet = null;
// 创建行
HSSFRow row = null;
// 创建列
HSSFCell cell = null; // 循环建立Sheet页
for (int i = ; i < sheetNames.length; i++) {
// 读取模板中模板Sheet页中的内容
sheetModel = wb.getSheetAt();
// 设置新建Sheet的页名
newSheet = wb.createSheet(sheetNames[i]);
// 将模板中的内容复制到新建的Sheet页中
copySheet(wb, sheetModel, newSheet, sheetModel.getFirstRowNum(), sheetModel.getLastRowNum()); //获取到新建Sheet页中的第一行为其中的列赋值
row=newSheet.getRow();
row.getCell().setCellValue("这是为表代码赋的值");
//注意 合并的单元格也要按照合并前的格数来算
row.getCell().setCellValue("这是为外部代码赋的值"); //获取模板中的第二列,并赋值
row=newSheet.getRow();
row.getCell().setCellValue("表名称赋值");
//注意 合并的单元格也要按照合并前的格数来算
row.getCell().setCellValue("这是为是否系统表赋的值"); // 遍历数据源 开始写入数据(因为Excel中是从0开始,所以减一)
int num = rowNum - ;
for (Map<String, String> item : dataSource) {
// 循环遍历,新建行
row = newSheet.createRow((short) num);
//判断有多少列数据
for (int j = ; j < keyNames.length; j++) {
// 设置每列的数据 设置每列的样式 设置每列的值
cell = row.createCell(j); cell.setCellStyle(style); cell.setCellValue(item.get(keyNames[j]));
}
num++;
}
// break 加break可以测试只添加一个Sheet页的情况
}
// 写入流
wb.write(fileOut);
// 关闭流
fileOut.close();
} /**
*
* @param Excel工作簿对象
* @param 模板Sheet页
* @param 新建Sheet页
* @param 模板页的第一行
* @param 模板页的最后一行
*/
private static void copySheet(HSSFWorkbook wb, HSSFSheet fromsheet, HSSFSheet newSheet, int firstrow, int lasttrow) { // 复制一个单元格样式到新建单元格
if ((firstrow == -) || (lasttrow == -) || lasttrow < firstrow) {
return;
}
// 复制合并的单元格
Region region = null;
for (int i = ; i < fromsheet.getNumMergedRegions(); i++) {
region = fromsheet.getMergedRegionAt(i);
if ((region.getRowFrom() >= firstrow) && (region.getRowTo() <= lasttrow)) {
newSheet.addMergedRegion(region);
}
}
HSSFRow fromRow = null;
HSSFRow newRow = null;
HSSFCell newCell = null;
HSSFCell fromCell = null;
// 设置列宽
for (int i = firstrow; i < lasttrow; i++) {
fromRow = fromsheet.getRow(i);
if (fromRow != null) {
for (int j = fromRow.getLastCellNum(); j >= fromRow.getFirstCellNum(); j--) {
int colnum = fromsheet.getColumnWidth((short) j);
if (colnum > ) {
newSheet.setColumnWidth((short) j, (short) colnum);
}
if (colnum == ) {
newSheet.setColumnHidden((short) j, true);
} else {
newSheet.setColumnHidden((short) j, false);
}
}
break;
}
} // 复制行并填充数据
for (int i = ; i < lasttrow; i++) {
fromRow = fromsheet.getRow(i);
if (fromRow == null) {
continue;
}
newRow = newSheet.createRow(i - firstrow);
newRow.setHeight(fromRow.getHeight());
for (int j = fromRow.getFirstCellNum(); j < fromRow.getPhysicalNumberOfCells(); j++) {
fromCell = fromRow.getCell((short) j);
if (fromCell == null) {
continue;
}
newCell = newRow.createCell((short) j);
newCell.setCellStyle(fromCell.getCellStyle());
int cType = fromCell.getCellType();
newCell.setCellType(cType);
switch (cType) {
case HSSFCell.CELL_TYPE_STRING:
newCell.setCellValue(fromCell.getRichStringCellValue());
break;
case HSSFCell.CELL_TYPE_NUMERIC:
newCell.setCellValue(fromCell.getNumericCellValue());
break;
case HSSFCell.CELL_TYPE_FORMULA:
newCell.setCellValue(fromCell.getCellFormula());
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
newCell.setCellValue(fromCell.getBooleanCellValue());
break;
case HSSFCell.CELL_TYPE_ERROR:
newCell.setCellValue(fromCell.getErrorCellValue());
break;
default:
newCell.setCellValue(fromCell.getRichStringCellValue());
break;
}
}
}
} }

以上便是整个工具类的核心代码了

测试数据如下

/**
* 测试多Sheet页导出数据表格方法
*/
public static void ExcelTest(HttpServletResponse response){ //构建数据源
List<Map<String, String>> dataSourceList=new ArrayList<Map<String,String>>(){
{
add(new HashMap<String, String>(){{
put("字段编号", "");
put("字段代码", "BUSINESS_ID");
put("字段含义", "业务id");
put("数据类型", "VARCHAR");
put("长度", "");
put("主键", "是");
put("主码", "");
}});
add(new HashMap<String, String>(){{
put("字段编号", "");
put("字段代码", "PROC_INST_ID");
put("字段含义", "流程实例编号");
put("数据类型", "VARCHAR");
put("长度", "");
put("主键", "");
put("主码", " ");
}});
add(new HashMap<String, String>(){{
put("字段编号", "");
put("字段代码", "PROC_STATE");
put("字段含义", "流程状态");
put("数据类型", "VARCHAR");
put("长度", "");
put("主键", " ");
put("主码", " ");
}});
add(new HashMap<String, String>(){{
put("字段编号", "");
put("字段代码", "APPLICANT");
put("字段含义", "申请人");
put("数据类型", "VARCHAR");
put("长度", "");
put("主键", " ");
put("主码", " ");
}});
add(new HashMap<String, String>(){{
put("字段编号", "");
put("字段代码", "LEAVE_TYPE");
put("字段含义", "请假类型");
put("数据类型", "VARCHAR");
put("长度", "");
put("主键", " ");
put("主码", " ");
}});
add(new HashMap<String, String>(){{
put("字段编号", "");
put("字段代码", "REASON");
put("字段含义", "请假事因");
put("数据类型", "VARCHAR");
put("长度", "");
put("主键", " ");
put("主码", " ");
}});
add(new HashMap<String, String>(){{
put("字段编号", "");
put("字段代码", "BEGIN_TIME");
put("字段含义", "起始时间");
put("数据类型", "TIMESTAMP");
put("长度", "");
put("主键", " ");
put("主码", " ");
}});
add(new HashMap<String, String>(){{
put("字段编号", "");
put("字段代码", "END_TIME");
put("字段含义", "结束时间");
put("数据类型", "TIMESTAMP");
put("长度", "");
put("主键", " ");
put("主码", " ");
}});
add(new HashMap<String, String>(){{
put("字段编号", "");
put("字段代码", "INSERT_PERSON");
put("字段含义", "登记人");
put("数据类型", "VARCHAR");
put("长度", "");
put("主键", " ");
put("主码", " ");
}});
add(new HashMap<String, String>(){{
put("字段编号", "");
put("字段代码", "APPROVEDBY");
put("字段含义", "批准人");
put("数据类型", "VARCHAR");
put("长度", "");
put("主键", " ");
put("主码", " ");
}});
}
};
//构建数据源中的key值
String[] keysStrings={"字段编号","字段代码","字段含义","数据类型","长度","主键","主码"};
//每页的名称
String [] sheetNameStrings={"Sheet1","Sheet2","Sheet3","Sheet4","Sheet5","Sheet6"};
String modelURLString="D:\\model\\model.xls";
try {
ExcelUtil.ExcelByModel("测试模板导出", modelURLString, dataSourceList, response, sheetNameStrings, keysStrings, );
} catch (Exception e) {
e.printStackTrace();
} }

以上就是关于Excel报表根据模板导出并生成多个Sheet也的小工具了,需要的可以参考代码,根据实际业务需求 进行代码调整。

根据模板导出Excel报表并生成多个Sheet页的更多相关文章

  1. ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案 try.dot.net 的正确使用姿势 .Net NPOI 根据excel模板导出excel、直接生成excel .Net NPOI 上传excel文件、提交后台获取excel里的数据

    ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案   ASP.NET Core 从2.2版本开始,采用了一个新的名为Endpoint的路由方案,与原来的方案在使用上差别不 ...

  2. 根据模板导出Excel报表并复制模板生成多个Sheet页

    因为最近用报表导出比较多,所有就提成了一个工具类,本工具类使用的场景为  根据提供的模板来导出Excel报表 并且可根据提供的模板Sheet页进行复制 从而实现多个Sheet页的需求, 使用本工具类时 ...

  3. .Net NPOI 根据excel模板导出excel、直接生成excel

    一.根据Excel模板导出excel 1.导入NPOI.dll  2.DAL中添加类ExportExcel.cs using NPOI.SS.UserModel; using System; usin ...

  4. POI通过模板导出EXCEL文件

    一般的EXCEL导出使用POI先创建一个HSSFWorkbook,然后通过不断创建HSSFRow,HSSFCell后设置单元格内容便可以完成导出. 这次在项目中需要用到模板,导出的内容包括(1.模板中 ...

  5. apache poi根据模板导出excel

    需要预先新建编辑好一个excel文件,设置好样式. 编辑好输出的数据,根据excel坐标一一对应. 支持列表数据输出,列表中列合并. 代码如下: package com.icourt.util; im ...

  6. Java无模板导出Excel,Apache-POI插件实现

    开发环境 jdk 1.8 Maven 3.6 Tomcat 8.5 SpringBoot 2.1.4.RELEASE Apache-POI 3.6 Idea 注意: 我是在现有的基于SpringBoo ...

  7. NPOI复制模板导出Excel

    本人菜鸟实习生一枚,公司给我安排了一个excel导出功能.要求如下:1.导出excel文件有样式要求:2.导出excel包含一个或多个工作表:3.功能做活(我的理解就是excel样式以后可能会变方便维 ...

  8. 从数据库中导出excel报表

    通常需要将后台数据库中的数据集或者是其他列表等导出excel 报表,这里主要引用了Apose.cells dll 类库, (1)直接上主要代码: protected void txtExport_Cl ...

  9. poi导出Excel报表多表头双层表头、合并单元格

    效果图: controller层方法: /**     *      * 导出Excel报表     * @param request     * @return     *      */    @ ...

随机推荐

  1. C++实现具有基本功能的智能指针

    C++中的智能指针实际上是代理模式与RAII的结合. 自定义unique_ptr,主要是release()和reset().代码如下. #include <iostream> using ...

  2. Ubuntu安装搜狗拼音

    p { margin-bottom: 0.25cm; direction: ltr; color: rgb(0, 0, 0); line-height: 120% } p.western { font ...

  3. 消费创富会开发模式系统App

    消费创富会系统定制开发,消费创富会网页开发模式,消费创富会开发软件,消费创富会系统APP开发,消费创富会平台模式开发,专业开发微信商城分销.公排.全返.分红.互助等模式定制开发,APP.网页版.微信端 ...

  4. 怎么写cookie

    html结构 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  5. java实现解析二进制文件(字符串、图片)

    1.需求说明,实现细节要求: 解析二进制文件 files\case10\binary,其中包含一个字符串和一张图片,数据文件格式为字符串数据长度(2字节)+字符串内容+图片数据长度(4字节)+图片数据 ...

  6. 设计模式 -- 迭代器模式(Iterator)

    --------------------------------------------------------------------- 1.场景问题 考虑这样一个问题: 9个学生对象分别通过数组存 ...

  7. linux-Centos6.5中nginx1.63源码安装

    我自己在学习的过程中,搜索网上的教程,碰了很多壁,终于总结出自己一套易于配置和管理的安装方法 如果是用于生产环境,不用盲目追求最新版本,跟着我这个来就好了. 安装前预热: 1.创建nginx专属用户: ...

  8. pom.xml配置详解

    <!--可以免费转载,转载时请注明出处  http://pengqb.iteye.com .--><project xmlns="http://maven.apache.o ...

  9. Swift2.0 函数学习笔记

    最近又有点忙,忙着找工作,忙着适应这个新环境.现在好了,上班两周周了,也适应过来了,又有时间安安静静的就行我们前面的学习了.今天这篇笔记,记录的就是函数的使用.下面这些代码基本上是理清楚了函数的额使用 ...

  10. Codeforces 719B Anatoly and Cockroaches

    B. Anatoly and Cockroaches time limit per test:1 second memory limit per test:256 megabytes input:st ...