package com.manyi.iw.agent.sale.utils;
import org.apache.poi.hssf.usermodel.*;
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.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.*;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by kehui on 2014/11/14.
*/
public class PoiUtil {
public static HSSFWorkbook initWorkbookByTemplate(List<List<String>> data, InputStream is, int offsetRow)
throws IOException {
return initWorkbook(data, null, is, offsetRow);
}
public static HSSFWorkbook initWorkbookByData(List<List<String>> data, List<String> titles, int offsetRow)
throws IOException {
return initWorkbook(data, titles, null, offsetRow);
}
/**
* 可支持两种方式的xls输出
* 1.根据已有xls文件的输入流,初始化workbook,填充数据
* 2.新建workbook,根据传入数据和标题填充workbook
* @param data 需要填充的数据
* @param titles 标题
* @param is 模板的输入流
* @param offsetRow 行偏移量
* @return
* @throws IOException
*/
public static HSSFWorkbook initWorkbook(List<List<String>> data, List<String> titles, InputStream is, int offsetRow)
throws IOException {
HSSFWorkbook workbook = null;
HSSFSheet sheet = null;
if (is == null) {
workbook = new HSSFWorkbook();
sheet = workbook.createSheet();
} else {
workbook = new HSSFWorkbook(is);
sheet = workbook.getSheetAt(0);
}
if (data == null || data.size() == 0)
return workbook;
HSSFCellStyle cellStyle = workbook.createCellStyle();
//HSSFFont font = workbook.createFont();
//font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
//font.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
//cellStyle.setFont(font);
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
for (int i = 0; i < data.size(); i++) {
List<String> rowData = data.get(i);
HSSFRow row = sheet.createRow(offsetRow + i);
if (i == 0 && (null != titles && titles.size() > 0)) {
for (int j = 0; j < titles.size(); j++) {
//HSSFCell cell = createTitleCell(row, workbook, j, rowData.get(j));
HSSFCell cell = row.createCell(j);
cell.setCellStyle(cellStyle);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setCellValue(rowData.get(j));
}
continue;
}
for (int i1 = 0; i1 < rowData.size(); i1++) {
//HSSFCell cell = createTitleCell(row, workbook, i1, rowData.get(i1));
HSSFCell cell = row.createCell(i1);
cell.setCellStyle(cellStyle);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setCellValue(rowData.get(i1));
}
}
return workbook;
}
public static HSSFCell createTitleCell(HSSFRow row, HSSFWorkbook workbook, int cellNumber, String cellValue) {
HSSFCell cell = row.createCell(cellNumber);
//cell.setEncoding(HSSFCell.ENCODING_UTF_16);
HSSFCellStyle cellStyle = workbook.createCellStyle();
//HSSFFont font = workbook.createFont();
//font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
//font.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
//cellStyle.setFont(font);
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
cell.setCellStyle(cellStyle);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setCellValue(cellValue);
return cell;
}
public static void main(String[] args) throws Exception{
}
/**
* SXSS导出
* @param data
* @param titles
* @param is
* @param offsetRow
* @return
* @throws IOException
*/
public static SXSSFWorkbook initSXSSWorkbook(List<List<String>> data, List<String> titles,InputStream is, int offsetRow) throws IOException {
XSSFWorkbook workbook = null;
XSSFSheet sheet = null;
if (is == null) {
workbook =new XSSFWorkbook();
sheet = workbook.createSheet();
} else {
workbook = new XSSFWorkbook(new BufferedInputStream(is));
sheet = workbook.getSheetAt(0);
}
SXSSFWorkbook newWorkbook = new SXSSFWorkbook(workbook,100);
Sheet newSheet = newWorkbook.getSheetAt(0);
CellStyle cellStyle = newWorkbook.createCellStyle();
if (data == null || data.size() == 0){
return newWorkbook;
}
for (int i = 0; i < data.size(); i++) {
List<String> rowData = data.get(i);
Row newRow = newSheet.createRow(offsetRow + i);
if (i == 0 && (null != titles && titles.size() > 0)) {
for (int j = 0; j < titles.size(); j++) {
Cell cell = newRow.createCell(j);
cell.setCellStyle(cellStyle);
cell.setCellType(XSSFCell.CELL_TYPE_STRING);
cell.setCellValue(rowData.get(j));
}
continue;
}
for (int i1 = 0; i1 < rowData.size(); i1++) {
Cell cell = newRow.createCell(i1);
cell.setCellStyle(cellStyle);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setCellValue(rowData.get(i1));
}
}
return newWorkbook;
}
}
/**
* 根据一个实体集合,获得用于填充Excel的数据
*
* @param ts 实体集合
* @param fieldNames 实体中的字段名称(一定要输入正确)
* @return
*/
public <T> List<List<String>> getExportData(List<T> ts, String... fieldNames) {
if(CollectionUtils.isEmpty(ts))
return null;
List<List<String>> data = new ArrayList<>();
for(T t : ts) {
List<String> strs = new ArrayList<>();
for(String fn : fieldNames) {
String value = "";
try {
value = BeanUtils.getProperty(t, fn);
} catch(IllegalAccessException e) {
value = fn;
} catch(InvocationTargetException e) {
value = fn;
} catch(NoSuchMethodException e) {
value = fn;
}
strs.add(value);
}
data.add(strs);
}
return data;
}
/**
* 报表导出通用方法
*
* @param response
* @param data 报表的填充数据
* @param templateType 导出文件所使用的模板类型
* @param offset 行偏移量
*/
public void exportExcel(HttpServletResponse response,
HttpServletRequest request,
List<List<String>> data,
String fileName,
int templateType,
int offset) throws IOException {
ExportTemplateEnum exportTemplate = ExportTemplateEnum.getTemplate(templateType);
if(null == exportTemplate)
return;
InputStream is = this.getClass().getClassLoader().getResourceAsStream("excel-template/" + exportTemplate.getFileName());
if(is == null)
return;
String exportFileName = new String((StringUtils.isBlank(fileName) ?
exportTemplate.getDesc() :
fileName).getBytes(request.getCharacterEncoding()), "ISO8859-1");
//后辍
exportFileName += exportTemplate.getFileName().substring(exportTemplate.getFileName().lastIndexOf("."));
response.addHeader("Content-Disposition", "attachment;filename=\"" + exportFileName + "\"");
response.setContentType("application/x-download");
response.addHeader("Content-Encoding", "utf-8");
OutputStream os = response.getOutputStream();
HSSFWorkbook workbook = PoiUtil.initWorkbookByTemplate(data, is, offset);
workbook.write(os);
os.flush();
os.close();
is.close();
}
public void exportSXSSFExcel(HttpServletResponse response,
HttpServletRequest request,
List<List<String>> data,
String fileName,
int templateType,
int offset) throws IOException {
ExportTemplateEnum exportTemplate = ExportTemplateEnum.getTemplate(templateType);
if(null == exportTemplate)
return;
FileInputStream is = new FileInputStream(this.getClass().getClassLoader().getResource("excel-template/" + exportTemplate.getFileName()).getFile());
if(is == null)
return;
String exportFileName = new String((StringUtils.isBlank(fileName) ?
exportTemplate.getDesc() :
fileName).getBytes(request.getCharacterEncoding()), "ISO8859-1");
//后辍
exportFileName += exportTemplate.getFileName().substring(exportTemplate.getFileName().lastIndexOf("."));
response.addHeader("Content-Disposition", "attachment;filename=\"" + exportFileName + "\"");
response.setContentType("application/x-download");
response.addHeader("Content-Encoding", "utf-8");
OutputStream os = response.getOutputStream();
SXSSFWorkbook workbook = PoiUtil.initSXSSWorkbook(data, null,is, offset);
workbook.write(os);
os.flush();
os.close();
is.close();
}
List<QuerySignExportResult> list4 = agentService.querySignOther(cityName, cityId, beginDate, endDate);
List<List<String>> data4 = getExportData(list4,
"cityName",
"createTime",
"agentId",
"agentName",
"agentMobile",
"groupName",
"mendianName",
"areaName",
"bigAreaName",
"callMobile",
"signName",
"remark");
exportSXSSFExcel(response, request, data4, "标为其他", ExportTemplateEnum.signOther.getType(), 1);
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>${poi.version}</version>
</dependency>
<poi.version>3.9</poi.version>