excel-kit/src/com/lxyer/excel/poi/ExcelKit.java
2018-12-02 14:03:46 +08:00

371 lines
13 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.lxyer.excel.poi;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.OfficeXmlFileException;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.*;
/**
下载示例
private static boolean downloadExcel(Workbook wb, String xlsName, HttpServletRequest request, HttpServletResponse response) throws IOException{
if(request.getHeader("user-agent").indexOf("MSIE") != -1) {
xlsName = java.net.URLEncoder.encode(xlsName,"utf-8") + ".xls";
} else {
xlsName = new String(xlsName.getBytes("utf-8"),"iso-8859-1")+ ".xls";
}
OutputStream os = response.getOutputStream();
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment;filename="+xlsName);
wb.write(os);
return true;
}
* 使用poi报表导出工具类
* 把poi的一个调用接口抽出来便于导出功能的管理
* @author LiangXianYou lxy208@126.com
* @param
*
*/
public class ExcelKit {
/**
* Excels导出多个sheet
*
* @author LiangXianYou
* @date 2015-6-16 下午5:56:56
*/
//map:data,sheetName,hds,hdNames,xlsName;
public static <T> Workbook exportExcels(List<Map<String, Object>> list) throws Exception {
Workbook wb = new XSSFWorkbook(); //创建工作薄
for (int i = 0; i < list.size(); i++) {
Map<String, Object> map = list.get(i);
Sheet sheet = wb.createSheet(); //创建工作表
String sheetName = (String) map.get("sheetName");
wb.setSheetName(i, sheetName);
//写入表头---Excel的第一行数据
Row nRow = sheet.createRow(0); //创建行
String[] hdNames = (String[]) map.get("hdNames");
for (int j = 0; j < hdNames.length; j++) {
Cell nCell = nRow.createCell(j); //创建单元格
nCell.setCellValue(hdNames[j]);
}
//写入每一行数据---一条记录就是一行数据
@SuppressWarnings("unchecked")
List<T> data = (List<T>) map.get("data");
String[] hds = (String[]) map.get("hds");
for (int j = 0; j < data.size(); j++) {
for (int k = 0; k < hds.length; k++) {
Object o = getFieldValue(data.get(j), hds[k]); //得到列的值
data2Excel(sheet, o, j + 1, k); //将值写入Excel
}
}
}
return wb;
}
/**
* 参数说明:
* listlist数据集合
* hdNames表头需要显示的名称
* hds表头对应的对象属性名称和 hdNames一一对应
* xlsName导出Excel的预定义名称
* request: HttpServletRequest
* responseHttpServletResponse
* 通过数据构建Excel
*
* @throws Exception
* @author LiangXianYou
* @date 2015-3-13 上午11:00:30
*/
public static <T> Workbook exportExcel(List<T> list, String[] hdNames, String[] hds) throws Exception {
Workbook wb = new XSSFWorkbook(); //创建工作薄
Sheet sheet = wb.createSheet(); //创建工作表
sheet.autoSizeColumn((short) 0); //自适应宽度
//写入表头---Excel的第一行数据
Row nRow = sheet.createRow(0); //创建行
for (int i = 0; i < hdNames.length; i++) {
Cell nCell = nRow.createCell(i); //创建单元格
nCell.setCellValue(hdNames[i]);
}
//写入每一行数据---一条记录就是一行数据
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < hds.length; j++) {
Object o = getFieldValue(list.get(i), hds[j]); //得到列的值
data2Excel(sheet, o, i + 1, j); //将值写入Excel
}
}
return wb;
}
/**
* 通过泛型实例对象得到某一字段值
*
* @author LiangXianYou
* @date 2015-3-13 上午10:53:32
*/
private static <T> Object getFieldValue(T t, String fieldName) throws Exception {
Object v;
if (t == null) {
v = null;
} else if (t instanceof Map) {
v = ((Map) t).get(fieldName); //得到列的值
} else {
Field field = t.getClass().getDeclaredField(fieldName);
field.setAccessible(true); //暴力反射
v = field.get(t); //得到字段数据的值
}
return v;
}
/**
* 将数据写到Excel中
*
* @author LiangXianYou
* @date 2015-3-13 上午10:37:55
*/
private static void data2Excel(Sheet sheet, Object o, Integer r, Integer c) {
//通过获得sheet中的某一列有得到没有创建
Row nRow = sheet.getRow(r);
if (nRow == null) {
nRow = sheet.createRow(r);
}
Cell nCell = nRow.createCell(c);
//根据不同类型进行转化,如有其它类型没有考虑周全的,使用发现的时候添加
if (o instanceof Integer) nCell.setCellValue((Integer) o);
else if (o instanceof Double) nCell.setCellValue((Double) o);
else if (o instanceof Float) nCell.setCellValue((Float) o);
else if (o instanceof String) nCell.setCellValue((String) o);
else if (o instanceof Date) nCell.setCellValue(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(o));
else if (o instanceof Calendar) nCell.setCellValue((Calendar) o);
else if (o instanceof Boolean) nCell.setCellValue((Boolean) o);
else if (o == null) nCell.setCellValue("");
else nCell.setCellValue(o + "");
}
//======================= 读取excel ===============================
//read excel head
public static Map readExcelHead(File file, String[] fields) throws IOException {
List<Map> list = readExcel(file, fields, 1, null);
return list.size() > 0 ? list.get(0) : new HashMap();
}
//read excel head by sheetName
public static Map readExcelHead(File file, String[] fields, String sheetName) throws IOException {
List<Map> list = readExcel(file, fields, 1, sheetName);
return list.size() > 0 ? list.get(0) : new HashMap();
}
//read excel sheet[0]
public static List<Map> readExcel(File file, String[] fields) throws IOException {
return readExcel(file, fields, -1, null);
}
//read excel sheet[0] no fields
public static List<Map> readExcel(File file) throws IOException {
return readExcel(file, null, -1, null);
}
//read excel by sheetName
public static List<Map> readExcel(File file, String[] fields, String sheetName) throws IOException {
return readExcel(file, fields, -1, sheetName);
}
//read excel by sheetName no fields
public static List<Map> readExcel(File file, String sheetName) throws IOException {
return readExcel(file, null, -1, sheetName);
}
//read excel all sheet
public static Map<String, List<Map>> readExcelAll(File file, String[] fields) throws IOException {
return readExcelAll(file, fields, -1);
}
//read all excel no fields
public static Map<String, List<Map>> readExcelAll(File file) throws IOException {
return readExcelAll(file, null, -1);
}
//read excel sheet[0]
private static List<Map> readExcel(File file, String[] fields, int lastRowNum, String sheetName) throws IOException {
Workbook wk = getWorkbook(file);
Sheet sheet = sheetName == null ? wk.getSheetAt(0) : wk.getSheet(sheetName);
if (sheet == null) throw new OfficeXmlFileException("sheet[" + sheetName + "] can't findList");
if (lastRowNum < 0 || lastRowNum > sheet.getLastRowNum()) {
lastRowNum = sheet.getLastRowNum();
}
return readExcel(sheet, fields, lastRowNum);
}
/**
* read excel all sheet,
* can read excel 2007+ and 2007-
*
* @param file
* @param fields
* @param lastRowNum
* @return
* @throws IOException
*/
private static Map<String, List<Map>> readExcelAll(File file, String[] fields, int lastRowNum) throws IOException {
Workbook wk = getWorkbook(file);
Map<String, List<Map>> data = new LinkedHashMap<>();
//reading all sheet
for (int i = 0; i < wk.getNumberOfSheets(); i++) {
Sheet sheet = wk.getSheetAt(i);
List<Map> maps = readExcel(sheet, fields, lastRowNum);
//move head
if (lastRowNum < 0 && maps.size() > 0) {
maps.remove(0);
}
data.put(sheet.getSheetName(), maps);
}
return data;
}
/**
* read excel
*
* @author Lxyer 2016/8/1 10:32.
*/
private static List<Map> readExcel(Sheet sheet, String[] fields, int lastRowNum) throws OfficeXmlFileException {
if (lastRowNum < 0 || lastRowNum > sheet.getLastRowNum()) {
lastRowNum = sheet.getLastRowNum();
}
if (fields == null || fields.length == 0) {
return readExcel(sheet, lastRowNum);
}
List<Map> list = new ArrayList<>();
int t = 0;
r:
for (int i = 0; i <= lastRowNum; i++) {
Row row = sheet.getRow(i);
if (row == null) continue;
short cellNum = row.getLastCellNum();
//空跳过/连续三行为空结束
if (isEmptyRow(row, fields.length)) {
if (t++ > 3) break;
continue;
}
Map map = new HashMap();
for (int j = 0; j < cellNum && j < fields.length; j++) {
Cell cell = row.getCell(j);
if (cell == null) {
map.put(fields[j], "");
continue;
}
if (cell.getCellTypeEnum() == CellType.NUMERIC) {
map.put(fields[j], (long) cell.getNumericCellValue() + "");
} else {
map.put(fields[j], cell.getStringCellValue());
}
}
list.add(map);
}
return list;
}
/**
* @author Lxyer 2016/9/21 00:38.
*/
private static List<Map> readExcel(Sheet sheet, int lastRowNum) throws OfficeXmlFileException {
List<Map> list = new ArrayList<>();
if (lastRowNum < 0 || lastRowNum > sheet.getLastRowNum()) {
lastRowNum = sheet.getLastRowNum();
}
int t = 0;
r:
for (int i = 0; i <= lastRowNum; i++) {
Row row = sheet.getRow(i);
if (row == null) continue;
short cellNum = row.getLastCellNum();
//空跳过/连续三行为空结束
if (isEmptyRow(row, 3)) {
if (t++ > 3) break;
continue;
}
Map map = new HashMap();
for (int j = 0; j < cellNum; j++) {
String field = (char) ((j / 26 == 0 ? ' ' : 'a') + j / 26) + "" + (char) ('a' + j % 26);
field = field.replace(" ", "");
Cell cell = row.getCell(j);
if (cell == null) {
map.put(field, "");
continue;
}
if (cell.getCellTypeEnum() == CellType.NUMERIC) {
map.put(field, (long) cell.getNumericCellValue() + "");
} else {
map.put(field, cell.getStringCellValue());
}
}
list.add(map);
}
return list;
}
//空跳过/连续三行为空结束
private static boolean isEmptyRow(Row row, int len) {
for (int i = 0; i < row.getLastCellNum() && i < len; i++) {
Cell cell = row.getCell(i);//列
if (cell != null) {
if (cell.getCellTypeEnum() != CellType.NUMERIC && cell.getStringCellValue() != null && !cell.getStringCellValue().isEmpty()) {
return false;
} else if (cell.getCellTypeEnum() == CellType.NUMERIC && cell.getNumericCellValue() != 0) {
return false;
}
}
}
return true;
}
//get all sheet names
public static List<String> getSheetNames(File file) throws IOException {
Workbook wk = getWorkbook(file);
List<String> sheetNames = new ArrayList<>();
for (int i = 0; i < wk.getNumberOfSheets(); i++) {
sheetNames.add(wk.getSheetAt(i).getSheetName());
}
return sheetNames;
}
private static Workbook getWorkbook(File file) throws IOException {
Workbook wk;
try {
wk = new HSSFWorkbook(new FileInputStream(file));//if excel version 2007+ will throws OfficeXmlFileException
} catch (OfficeXmlFileException e) {
wk = new XSSFWorkbook(new FileInputStream(file));
}
return wk;
}
}