目前本人主要使用两种方法1.用原生的对象进行操作不使用模板,但是在表比较复杂是会有许多麻烦;2.模板法,若想生成的表格较复杂,可以先做一个空excel表格模板将样式做好,然后用输入流将整个文件读取再封装成excel对象然后进行遍历插入数据;
方法一: 工具类(封装生成excel和相应样式的方法)
package com.adon.util;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
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.CellRangeAddress;
import org.apache.poi.hssf.util.HSSFColor;
public class BuildExcel {
/**
* 生成Excel
* @param columnNum 列数
* @param itemMarks 列头名称 对应 Map中的Key
* @param itemParaps 列头名称
* @param list 数据
* @return
*/
public static HSSFWorkbook getInputStream(int columnNum, String[] itemMarks, String[] itemParaps, List list,String title){
HSSFWorkbook workbook = new HSSFWorkbook(); // 创建工作簿对象
HSSFSheet sheet = workbook.createSheet(); // 创建工作表
sheet.setDefaultColumnWidth ((short)20); // 设置工作表列宽
sheet.setDefaultRowHeight((short)10); // 设置工作表行高
//sheet样式定义
HSSFCellStyle columnTopStyle = getColumnTopStyle(workbook); //获取列头样式对象
HSSFCellStyle style = getStyle(workbook); //单元格样式对象
//<span style="color:#FF0000;"><em><strong>下面五行代码就是设置表头的代码</strong></em></span>(原理是将第1、2行合并单元格后作为表头区域)
// 产生表格标题行
HSSFRow rowm = sheet.createRow(0);
HSSFCell cellTiltle = rowm.createCell(0);
sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, (itemMarks.length-1)));
cellTiltle.setCellStyle(columnTopStyle);
cellTiltle.setCellValue(title);
//设置列头
HSSFRow row1 = sheet.createRow((short)2); // 在索引0的位置创建行(最顶端的行)
HSSFCell cell1 = null; // 在索引0的位置创建单元格(左上端)
// 将列头设置到sheet的单元格中
for(int n=0;n<columnNum;n++){
cell1 = row1.createCell((short)(n)); //创建列头对应个数的单元格
cell1.setCellType(HSSFCell.CELL_TYPE_STRING); //设置列头单元格的数据类型
try {
cell1.setCellValue(new String(itemParaps[n].getBytes("utf-8"),"UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} //设置列头单元格的值
cell1.setCellStyle(columnTopStyle); //设置列头单元格样式
}
//将查询出的数据设置到sheet对应的单元格中
if(list != null){
for(int i=0;i<list.size();i++){
Map map = (Map)list.get(i); //遍历每个对象
//创建行(从下面的i+1要注意,第0行是列头,因此创建新行要从下一行开始)
HSSFRow row = sheet.createRow(i+3); //创建所需的行数
for(short j=0;j<columnNum;j++){
HSSFCell cell = row.createCell(j,HSSFCell.CELL_TYPE_STRING);//设置单元格的数据类型
if(map.get(itemMarks[j])!=null){
cell.setCellValue(map.get(itemMarks[j]).toString()); //设置单元格的值
}else{
cell.setCellValue("");
}
cell.setCellStyle(style); //设置单元格样式
}
}
}
// ByteArrayOutputStream baos = new ByteArrayOutputStream();
// ByteArrayInputStream is = null;
/* try {
workbook.write(baos);
byte[] content = baos.toByteArray();
is = new ByteArrayInputStream(content,0,content.length);
baos.flush(); // 缓冲
baos.close(); // 关闭流
} catch (IOException e) {
e.printStackTrace();
}*/
return workbook;
}
/**
* 生成双公示Excel(注意与上方法有点不同)
* @param columnNum 列数
* @param itemMarks 列头名称 对应 Map中的Key
* @param itemParaps 列头名称
* @param list 数据
* @return
*/
public static HSSFWorkbook getInputStreamSGS(int columnNum, String[] itemMarks, String[] itemParaps, List list,String title){
HSSFWorkbook workbook = new HSSFWorkbook(); // 创建工作簿对象
HSSFSheet sheet = workbook.createSheet(); // 创建工作表
sheet.setDefaultColumnWidth ((short)20); // 设置工作表列宽
sheet.setDefaultRowHeight((short)10); // 设置工作表行高
//sheet样式定义
HSSFCellStyle columnTopStyle = getColumnTopStyle(workbook); //获取列头样式对象
HSSFCellStyle style = getStyle(workbook); //单元格样式对象
// 产生表格标题行
HSSFRow rowm = sheet.createRow(0);
HSSFCell cellTiltle = rowm.createCell(0);
sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, (itemParaps.length-1)));
cellTiltle.setCellStyle(columnTopStyle);
cellTiltle.setCellValue(title);
//设置列头
HSSFRow row1 = sheet.createRow((short)2); // 在索引0的位置创建行(最顶端的行)
HSSFCell cell1 = null; // 在索引0的位置创建单元格(左上端)
// 将列头设置到sheet的单元格中
for(int n=0;n<columnNum;n++){
cell1 = row1.createCell((short)(n)); //创建列头对应个数的单元格
cell1.setCellType(HSSFCell.CELL_TYPE_STRING); //设置列头单元格的数据类型
try {
cell1.setCellValue(new String(itemParaps[n].getBytes("utf-8"),"UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} //设置列头单元格的值
cell1.setCellStyle(columnTopStyle); //设置列头单元格样式
}
//将查询出的数据设置到sheet对应的单元格中
if(list != null){
for(int i=0;i<list.size();i++){
Map map = (Map)list.get(i); //遍历每个对象
//创建行(从下面的i+1要注意,第0行是列头,因此创建新行要从下一行开始)
HSSFRow row = sheet.createRow(i+3); //创建所需的行数
//项目名称
HSSFCell cell = row.createCell(0,HSSFCell.CELL_TYPE_STRING);//设置单元格的数据类型
//cell.setCellValue(map.get(itemMarks[1])+"车牌号为:"+map.get(itemMarks[0])+"车辆申请载运大件"+map.get(itemMarks[2])+"行驶河南省普通公路行政许可案"); //设置单元格的值
cell.setCellValue("在省、自治区范围内跨设区的市进行超限运输"); //设置单元格的值
cell.setCellStyle(style);
//设定依据
HSSFCell cell2 = row.createCell(1,HSSFCell.CELL_TYPE_STRING);//设置单元格的数据类型
cell2.setCellValue("《公路安全保护条例》第三十六条第二款"); //设置单元格的值
cell2.setCellStyle(style);
//行政许可结果
DecimalFormat dft = new DecimalFormat("0000000");
String passportCard=dft.format(new BigDecimal(map.get(itemMarks[11])+"") );
HSSFCell cell3 = row.createCell(2,HSSFCell.CELL_TYPE_STRING);//设置单元格的数据类型
cell3.setCellValue("准予"+map.get(itemMarks[1])+""+map.get(itemMarks[0])+"车辆行驶"+map.get(itemMarks[12])+"路线,发放《河南省普通公路超限运输通行证》通行证编号:"+passportCard); //设置单元格的值
cell3.setCellStyle(style);
//许可决定书文号
DecimalFormat df = new DecimalFormat("0000");
String wen=df.format(map.get(itemMarks[4]));
HSSFCell cell4 = row.createCell(3,HSSFCell.CELL_TYPE_STRING);//设置单元格的数据类型
cell4.setCellValue("["+map.get(itemMarks[3])+"]"+wen+"号"); //设置单元格的值
cell4.setCellStyle(style);
//许可时限
SimpleDateFormat sdfFolderDir = new SimpleDateFormat("yyyy-MM-dd");
String startTime = sdfFolderDir.format(new Date((Long)((Map)(map.get(itemMarks[6]))).get("time")));
String endTime = sdfFolderDir.format(new Date((Long)((Map)(map.get(itemMarks[7]))).get("time")));
HSSFCell cell5 = row.createCell(4,HSSFCell.CELL_TYPE_STRING);//设置单元格的数据类型
cell5.setCellValue(startTime+"至"+endTime); //设置单元格的值
cell5.setCellStyle(style);
//审批部门
HSSFCell cell6 = row.createCell(5,HSSFCell.CELL_TYPE_STRING);//设置单元格的数据类型
cell6.setCellValue("河南省交通运输厅公路管理局"); //设置单元格的值
cell6.setCellStyle(style);
/* for(short j=0;j<columnNum;j++){
HSSFCell cell = row.createCell(j,HSSFCell.CELL_TYPE_STRING);//设置单元格的数据类型
if(map.get(itemMarks[j])!=null){
cell.setCellValue(map.get(itemMarks[j]).toString()); //设置单元格的值
}else{
cell.setCellValue("");
}
cell.setCellStyle(style); //设置单元格样式
} */
}
}
// ByteArrayOutputStream baos = new ByteArrayOutputStream();
// ByteArrayInputStream is = null;
/* try {
workbook.write(baos);
byte[] content = baos.toByteArray();
is = new ByteArrayInputStream(content,0,content.length);
baos.flush(); // 缓冲
baos.close(); // 关闭流
} catch (IOException e) {
e.printStackTrace();
}*/
return workbook;
}
/**
* 生成Excel
* @param columnNum 列数
* @param itemMarks 列头名称 对应 Map中的Key
* @param itemParaps 列头名称
* @param list 数据
* @return
*/
public static InputStream getInputStream_test(int columnNum, String[] itemMarks, String[] itemParaps, List list){
HSSFWorkbook workbook = new HSSFWorkbook(); // 创建工作簿对象
HSSFSheet sheet = workbook.createSheet(); // 创建工作表
sheet.setDefaultColumnWidth ((short)20); // 设置工作表列宽
sheet.setDefaultRowHeight((short)10); // 设置工作表行高
//sheet样式定义
HSSFCellStyle columnTopStyle = getColumnTopStyle(workbook); //获取列头样式对象
HSSFCellStyle style = getStyle(workbook); //单元格样式对象
//设置列头
HSSFRow row1 = sheet.createRow((short)0); // 在索引0的位置创建行(最顶端的行)
HSSFCell cell1 = null; // 在索引0的位置创建单元格(左上端)
// 将列头设置到sheet的单元格中
for(int n=0;n<columnNum;n++){
cell1 = row1.createCell((short)(n)); //创建列头对应个数的单元格
cell1.setCellType(HSSFCell.CELL_TYPE_STRING); //设置列头单元格的数据类型
try {
cell1.setCellValue(new String(itemParaps[n].getBytes("utf-8"),"UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} //设置列头单元格的值
cell1.setCellStyle(columnTopStyle); //设置列头单元格样式
}
//将查询出的数据设置到sheet对应的单元格中
if(list != null){
for(int i=0;i<list.size();i++){
Map map = (Map)list.get(i); //遍历每个对象
//创建行(从下面的i+1要注意,第0行是列头,因此创建新行要从下一行开始)
HSSFRow row = sheet.createRow(i+1); //创建所需的行数
for(short j=0;j<columnNum;j++){
HSSFCell cell = row.createCell(j,HSSFCell.CELL_TYPE_STRING);//设置单元格的数据类型
if(map.get(itemMarks[j])!=null){
cell.setCellValue(map.get(itemMarks[j]).toString()); //设置单元格的值
}else{
cell.setCellValue("");
}
cell.setCellStyle(style); //设置单元格样式
}
}
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ByteArrayInputStream is = null;
try {
workbook.write(baos);
byte[] content = baos.toByteArray();
is = new ByteArrayInputStream(content,0,content.length);
baos.flush(); // 缓冲
baos.close(); // 关闭流
} catch (IOException e) {
e.printStackTrace();
}
return is;
}
/*
* 列头单元格样式
*/
public static HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook) {
// 设置字体
HSSFFont font = workbook.createFont();
//设置字体大小
font.setFontHeightInPoints((short)11);
//字体加粗
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
//设置字体名字
font.setFontName("Courier New");
//设置样式;
HSSFCellStyle style = workbook.createCellStyle();
//设置底边框;
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
//设置底边框颜色;
style.setBottomBorderColor(HSSFColor.BLACK.index);
//设置左边框;
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
//设置左边框颜色;
style.setLeftBorderColor(HSSFColor.BLACK.index);
//设置右边框;
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
//设置右边框颜色;
style.setRightBorderColor(HSSFColor.BLACK.index);
//设置顶边框;
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
//设置顶边框颜色;
style.setTopBorderColor(HSSFColor.BLACK.index);
//设置单元格背景颜色
//style.setFillBackgroundColor(HSSFColor.BLUE.index);
style.setFillForegroundColor(HSSFColor.TAN.index);
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
//在样式用应用设置的字体;
style.setFont(font);
//设置自动换行;
style.setWrapText(false);
//设置水平对齐的样式为居中对齐;
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//设置垂直对齐的样式为居中对齐;
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
return style;
}
/*
* 列数据信息单元格样式
*/
public static HSSFCellStyle getStyle(HSSFWorkbook workbook) {
// 设置字体
HSSFFont font = workbook.createFont();
//设置字体大小
//font.setFontHeightInPoints((short)10);
//字体加粗
//font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
//设置字体名字
font.setFontName("Courier New");
//设置样式;
HSSFCellStyle style = workbook.createCellStyle();
//设置底边框;
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
//设置底边框颜色;
style.setBottomBorderColor(HSSFColor.BLACK.index);
//设置左边框;
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
//设置左边框颜色;
style.setLeftBorderColor(HSSFColor.BLACK.index);
//设置右边框;
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
//设置右边框颜色;
style.setRightBorderColor(HSSFColor.BLACK.index);
//设置顶边框;
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
//设置顶边框颜色;
style.setTopBorderColor(HSSFColor.BLACK.index);
//在样式用应用设置的字体;
style.setFont(font);
//设置自动换行;
style.setWrapText(false);
//设置水平对齐的样式为居中对齐;
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//设置垂直对齐的样式为居中对齐;
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
return style;
}
}
需要调用生成excel代码的使用调用传递参数代码
//poi 报表导出
@RequestMapping("/comprehensiveInquiry/exportSGSBBExcel")
@ResponseBody
public void exportSGSBBExcel(
HttpServletRequest request, HttpServletResponse response) throws Exception{
List<LimitApply> lps= (List<LimitApply>) limitApplyService.exportSGSBBExcel().get("data");
String itemMark = "carNumber,transportDepartment,goodsName,whichYear,archivesNum,applyTime,startTime,endTime,startPlace,endPlace,handelDepartmentId,PASSPORT_CARD,trafficRoutes";
String itemParap = "项目名称,设定依据,行政许可结果,许可决定书文号,许可时限,审批部门";
String[] itemMarks = itemMark.split(",");//键
String[] itemParaps = itemParap.split(",");//列头
//双公示
HSSFWorkbook workbook= BuildExcel.getInputStreamSGS( itemParaps.length, itemMarks, itemParaps, lps,"河南省交通运输厅行政许可审批结果公示");
response.setContentType("application/vnd.ms-excel;");
response.setHeader("Content-disposition", "attachment;filename="+ new String("河南省交通运输厅行政许可审批结果公示.xls".getBytes("GB2312"), "ISO8859_1"));// 设定输出文件头
// response.setHeader("Content-disposition", "attachment;filename=汇总.xls");
OutputStream ouputStream = response.getOutputStream();
workbook.write(ouputStream);
ouputStream.flush();
ouputStream.close();
}
方法二:先做好想生成excel的模板 然后读取此模板成excel对象后进行数据插入如果模板有单元格就直接插入,没有就生成插入
package oa.nsbd.controller;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONArray;
import oa.nsbd.model.JdproblemStatistics;
import oa.nsbd.model.NsbdStatistics;
import oa.nsbd.model.page.CommonProFindPage;
import oa.nsbd.service.GGProblemStatisService;
import oa.nsbd.service.JDProblemStaitsService;
import oa.nsbd.service.NsbdProblemStatisticsService;
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.Region;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @author
* @date:
* @version :
*
*/
@Controller
public class ExlExportController {
@Autowired
private NsbdProblemStatisticsService nsbdservice;
@Autowired
private JDProblemStaitsService jdservice;
@Autowired GGProblemStatisService ggservice;
/**
*
* @param request
* @param responsensbdupdatestatis
* @param compage
*/
@RequestMapping(value = "/exlExport/exlExportFindnsbdproblemstatishz")
@ResponseBody
public void exlExportFindnsbdproblemstatishz(HttpServletRequest request,
HttpServletResponse response, CommonProFindPage compage){
String url=request.getSession().getServletContext().getRealPath("/");
String path = url+"\\exlModel\\1-1.xls";
OutputStream ouputStream = null;
try {
HSSFWorkbook workbook= null;//接收到的报表对象
InputStream inputStream = new FileInputStream(path);
workbook = new HSSFWorkbook(inputStream);
HSSFSheet sheet = workbook.getSheetAt(0);
//获取样式
HSSFRow styRow = null;
HSSFCell styCell = null;
HSSFCellStyle style_01 = null;
styRow = sheet.getRow(4);
styCell = styRow.getCell(3);
style_01 = styCell.getCellStyle();
HSSFRow dataRow = null;
HSSFCell dataCell = null;
List<NsbdStatistics> nsbdfjlist=nsbdservice.findNsbdFjHZ(compage);
/* System.out.println(nsbdfjlist.size()+"dddddd");
//首页合计排名*/
compage.setSszy("合计");
List<NsbdStatistics> detaillist=nsbdservice.findSSZYDetail(compage);
//分局统计
for(int i=0;i<nsbdfjlist.size();i++){
if(i==(nsbdfjlist.size()-1)){
dataRow=sheet.getRow(13);
}else{
dataRow=sheet.getRow(i+2);
}
if(!"".equals(nsbdfjlist.get(i).getSszy())){//所属专业
dataCell=dataRow.getCell(2);
dataCell.setCellValue(nsbdfjlist.get(i).getSszy());
}
if(!"".equals(nsbdfjlist.get(i).getPronum())){//问题总数
dataCell=dataRow.getCell(3);
dataCell.setCellValue(nsbdfjlist.get(i).getPronum());
}
if(!"".equals(nsbdfjlist.get(i).getYizg())){//已整改
dataCell=dataRow.getCell(4);
dataCell.setCellValue(nsbdfjlist.get(i).getYizg());
}
if(!"".equals(nsbdfjlist.get(i).getLinshicl())){//临时处理整改
dataCell=dataRow.getCell(5);
dataCell.setCellValue(nsbdfjlist.get(i).getLinshicl());
}
if(!"".equals(nsbdfjlist.get(i).getWeizg())){//问题总数
dataCell=dataRow.getCell(6);
dataCell.setCellValue(nsbdfjlist.get(i).getWeizg());
}
if(!"".equals(nsbdfjlist.get(i).getZgpro())){//问题整改率
dataCell=dataRow.getCell(7);
dataCell.setCellValue(nsbdfjlist.get(i).getZgpro()+"%");
}
}
for(int i=0;i<detaillist.size();i++){
dataRow = sheet.createRow(17+i);
dataRow.setHeight((short)600);
dataCell = dataRow.createCell(0);
dataCell.setCellValue(i+1);
dataCell.setCellStyle(style_01);
dataCell = dataRow.createCell(1);
dataCell.setCellValue(detaillist.get(i).getGlc());
dataCell.setCellStyle(style_01);
dataCell = dataRow.createCell(2);
dataCell.setCellValue("合计");
dataCell.setCellStyle(style_01);
if(!"".equals(detaillist.get(i).getPronum())){//问题总数
dataCell=dataRow.createCell(3);
dataCell.setCellValue(detaillist.get(i).getPronum());
dataCell.setCellStyle(style_01);
}
if(!"".equals(detaillist.get(i).getYizg())){//已整改问题数量
dataCell=dataRow.createCell(4);
dataCell.setCellValue(detaillist.get(i).getYizg());
dataCell.setCellStyle(style_01);
}
if(!"".equals(detaillist.get(i).getLinshicl())){//临时处理数量
dataCell=dataRow.createCell(5);
dataCell.setCellValue(detaillist.get(i).getLinshicl());
dataCell.setCellStyle(style_01);
}
if(!"".equals(detaillist.get(i).getWeizg())){//未整改数量
dataCell=dataRow.createCell(6);
dataCell.setCellValue(detaillist.get(i).getWeizg());
dataCell.setCellStyle(style_01);
}
if(!"".equals(detaillist.get(i).getZgpro())){//整改率
dataCell=dataRow.createCell(7);
dataCell.setCellValue(detaillist.get(i).getZgpro()+"%");
dataCell.setCellStyle(style_01);
}
}
response.setContentType("application/vnd.ms-excel;");
response.setHeader("Content-disposition", "attachment;filename="+ new String("河南分局整改情况统计表.xls".getBytes("GB2312"), "ISO8859_1"));// 设定输出文件头
ouputStream = response.getOutputStream();
workbook.write(ouputStream);
ouputStream.flush();
ouputStream.close();
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
ouputStream.flush();
ouputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}