来自:https://github.com/SargerasWang/ExcelUtil.git
<span style="color: #0000ff;">import<span style="color: #000000;"> org.apache.commons.beanutils.BeanComparator;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.apache.commons.collections.CollectionUtils;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.apache.commons.collections.ComparatorUtils;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.apache.commons.collections.comparators.ComparableComparator;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.apache.commons.collections.comparators.ComparatorChain;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.apache.commons.lang3.StringUtils;
<span style="color: #0000ff;">import org.apache.poi.hssf.usermodel.*<span style="color: #000000;">;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.apache.poi.ss.usermodel.Cell;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.apache.poi.ss.usermodel.Row;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.apache.poi.ss.util.CellReference;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.slf4j.Logger;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.slf4j.LoggerFactory;
<span style="color: #0000ff;">import<span style="color: #000000;"> java.io.IOException;
<span style="color: #0000ff;">import<span style="color: #000000;"> java.io.InputStream;
<span style="color: #0000ff;">import<span style="color: #000000;"> java.io.OutputStream;
<span style="color: #0000ff;">import<span style="color: #000000;"> java.lang.reflect.Field;
<span style="color: #0000ff;">import<span style="color: #000000;"> java.text.MessageFormat;
<span style="color: #0000ff;">import<span style="color: #000000;"> java.text.ParseException;
<span style="color: #0000ff;">import<span style="color: #000000;"> java.text.SimpleDateFormat;
<span style="color: #0000ff;">import java.util.*<span style="color: #000000;">;
<span style="color: #008000;">/**<span style="color: #008000;">
-
The ExcelUtil 与 {<span style="color: #808080;">@link<span style="color: #008000;"> ExcelCell}搭配使用
-
-
<span style="color: #808080;">@author<span style="color: #008000;"> sargeras.wang
-
<span style="color: #808080;">@version<span style="color: #008000;"> 1.0,Created at 2013年9月14日
<span style="color: #008000;">*/
<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> ExcelUtil {
<span style="color: #0000ff;">private <span style="color: #0000ff;">static Logger LG = LoggerFactory.getLogger(ExcelUtil.<span style="color: #0000ff;">class<span style="color: #000000;">);
<span style="color: #008000;">/**<span style="color: #008000;">
- 用来验证excel与Vo中的类型是否一致
- Map<栏位类型,只能是哪些Cell类型>
<span style="color: #008000;">*/
<span style="color: #0000ff;">private <span style="color: #0000ff;">static Map<Class<?>,Integer[]> validateMap = <span style="color: #0000ff;">new HashMap<Class<?>,Integer[]><span style="color: #000000;">();
<span style="color: #0000ff;">static<span style="color: #000000;"> {
validateMap.put(String[].<span style="color: #0000ff;">class,<span style="color: #0000ff;">new<span style="color: #000000;"> Integer[]{Cell.CELL_TYPE_STRING});
validateMap.put(Double[].<span style="color: #0000ff;">class,<span style="color: #0000ff;">new<span style="color: #000000;"> Integer[]{Cell.CELL_TYPE_NUMERIC});
validateMap.put(String.<span style="color: #0000ff;">class,<span style="color: #0000ff;">new<span style="color: #000000;"> Integer[]{Cell.CELL_TYPE_STRING});
validateMap.put(Double.<span style="color: #0000ff;">class,<span style="color: #0000ff;">new<span style="color: #000000;"> Integer[]{Cell.CELL_TYPE_NUMERIC});
validateMap.put(Date.<span style="color: #0000ff;">class,<span style="color: #0000ff;">new<span style="color: #000000;"> Integer[]{Cell.CELL_TYPE_NUMERIC,Cell.CELL_TYPE_STRING});
validateMap.put(Integer.<span style="color: #0000ff;">class,<span style="color: #0000ff;">new<span style="color: #000000;"> Integer[]{Cell.CELL_TYPE_NUMERIC});
validateMap.put(Float.<span style="color: #0000ff;">class,<span style="color: #0000ff;">new<span style="color: #000000;"> Integer[]{Cell.CELL_TYPE_NUMERIC});
validateMap.put(Long.<span style="color: #0000ff;">class,<span style="color: #0000ff;">new<span style="color: #000000;"> Integer[]{Cell.CELL_TYPE_NUMERIC});
validateMap.put(Boolean.<span style="color: #0000ff;">class,<span style="color: #0000ff;">new<span style="color: #000000;"> Integer[]{Cell.CELL_TYPE_BOOLEAN});
}
<span style="color: #008000;">/**<span style="color: #008000;">
- 获取cell类型的文字描述
-
- <span style="color: #808080;">@param<span style="color: #008000;"> cellType
- Cell.CELL_TYPE_BLANK
- Cell.CELL_TYPE_BOOLEAN
- Cell.CELL_TYPE_ERROR
- Cell.CELL_TYPE_FORMULA
- Cell.CELL_TYPE_NUMERIC
- Cell.CELL_TYPE_STRING
-
- <span style="color: #808080;">@return
<span style="color: #008000;">*/
<span style="color: #0000ff;">private <span style="color: #0000ff;">static String getCellTypeByInt(<span style="color: #0000ff;">int<span style="color: #000000;"> cellType) {
<span style="color: #0000ff;">switch<span style="color: #000000;"> (cellType) {
<span style="color: #0000ff;">case<span style="color: #000000;"> Cell.CELL_TYPE_BLANK:
<span style="color: #0000ff;">return "Null type"<span style="color: #000000;">;
<span style="color: #0000ff;">case<span style="color: #000000;"> Cell.CELL_TYPE_BOOLEAN:
<span style="color: #0000ff;">return "Boolean type"<span style="color: #000000;">;
<span style="color: #0000ff;">case<span style="color: #000000;"> Cell.CELL_TYPE_ERROR:
<span style="color: #0000ff;">return "Error type"<span style="color: #000000;">;
<span style="color: #0000ff;">case<span style="color: #000000;"> Cell.CELL_TYPE_FORMULA:
<span style="color: #0000ff;">return "Formula type"<span style="color: #000000;">;
<span style="color: #0000ff;">case<span style="color: #000000;"> Cell.CELL_TYPE_NUMERIC:
<span style="color: #0000ff;">return "Numeric type"<span style="color: #000000;">;
<span style="color: #0000ff;">case<span style="color: #000000;"> Cell.CELL_TYPE_STRING:
<span style="color: #0000ff;">return "String type"<span style="color: #000000;">;
<span style="color: #0000ff;">default<span style="color: #000000;">:
<span style="color: #0000ff;">return "Unknown type"<span style="color: #000000;">;
}
}
<span style="color: #008000;">/**<span style="color: #008000;">
- 获取单元格值
-
- <span style="color: #808080;">@param<span style="color: #008000;"> cell
- <span style="color: #808080;">@return
<span style="color: #008000;">*/
<span style="color: #0000ff;">private <span style="color: #0000ff;">static<span style="color: #000000;"> Object getCellValue(Cell cell) {
<span style="color: #0000ff;">if (cell == <span style="color: #0000ff;">null
|| (cell.getCellType() == Cell.CELL_TYPE_STRING &&<span style="color: #000000;"> StringUtils.isBlank(cell
.getStringCellValue()))) {
<span style="color: #0000ff;">return <span style="color: #0000ff;">null<span style="color: #000000;">;
}
<span style="color: #0000ff;">int cellType =<span style="color: #000000;"> cell.getCellType();
<span style="color: #0000ff;">switch<span style="color: #000000;"> (cellType) {
<span style="color: #0000ff;">case<span style="color: #000000;"> Cell.CELL_TYPE_BLANK:
<span style="color: #0000ff;">return <span style="color: #0000ff;">null<span style="color: #000000;">;
<span style="color: #0000ff;">case<span style="color: #000000;"> Cell.CELL_TYPE_BOOLEAN:
<span style="color: #0000ff;">return<span style="color: #000000;"> cell.getBooleanCellValue();
<span style="color: #0000ff;">case<span style="color: #000000;"> Cell.CELL_TYPE_ERROR:
<span style="color: #0000ff;">return<span style="color: #000000;"> cell.getErrorCellValue();
<span style="color: #0000ff;">case<span style="color: #000000;"> Cell.CELL_TYPE_FORMULA:
<span style="color: #0000ff;">return<span style="color: #000000;"> cell.getNumericCellValue();
<span style="color: #0000ff;">case<span style="color: #000000;"> Cell.CELL_TYPE_NUMERIC:
<span style="color: #0000ff;">return<span style="color: #000000;"> cell.getNumericCellValue();
<span style="color: #0000ff;">case<span style="color: #000000;"> Cell.CELL_TYPE_STRING:
<span style="color: #0000ff;">return<span style="color: #000000;"> cell.getStringCellValue();
<span style="color: #0000ff;">default<span style="color: #000000;">:
<span style="color: #0000ff;">return <span style="color: #0000ff;">null<span style="color: #000000;">;
}
}
<span style="color: #008000;">/**<span style="color: #008000;">
- 利用JAVA的反射机制,将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
- 用于单个sheet
-
- <span style="color: #808080;">@param<span style="color: #008000;">
- <span style="color: #808080;">@param<span style="color: #008000;"> headers 表格属性列名数组
- <span style="color: #808080;">@param<span style="color: #008000;"> dataset 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的
- javabean属性的数据类型有基本数据类型及String,Date,String[],Double[]
- <span style="color: #808080;">@param<span style="color: #008000;"> out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
<span style="color: #008000;">*/
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void exportExcel(String[] headers,Collection<span style="color: #000000;"> dataset,OutputStream out) {
exportExcel(headers,dataset,out,<span style="color: #0000ff;">null<span style="color: #000000;">);
}
<span style="color: #008000;">/**<span style="color: #008000;">
-
利用JAVA的反射机制,将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
-
用于单个sheet
-
-
<span style="color: #808080;">@param<span style="color: #008000;">
-
<span style="color: #808080;">@param<span style="color: #008000;"> headers 表格属性列名数组
-
<span style="color: #808080;">@param<span style="color: #008000;"> dataset 需要显示的数据集合,Double[]
-
<span style="color: #808080;">@param<span style="color: #008000;"> out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
-
<span style="color: #808080;">@param<span style="color: #008000;"> pattern 如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
<span style="color: #008000;">*/
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void exportExcel(String[] headers,OutputStream out,String pattern) {
<span style="color: #008000;">//<span style="color: #008000;"> 声明一个工作薄
HSSFWorkbook workbook = <span style="color: #0000ff;">new<span style="color: #000000;"> HSSFWorkbook();
<span style="color: #008000;">//<span style="color: #008000;"> 生成一个表格
HSSFSheet sheet =<span style="color: #000000;"> workbook.createSheet();
write2Sheet(sheet,headers,pattern);
<span style="color: #0000ff;">try<span style="color: #000000;"> {
workbook.write(out);
} <span style="color: #0000ff;">catch<span style="color: #000000;"> (IOException e) {
LG.error(e.toString(),e);
}
}
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> exportExcel(String[][] datalist,OutputStream out) {
<span style="color: #0000ff;">try<span style="color: #000000;"> {
<span style="color: #008000;">//<span style="color: #008000;"> 声明一个工作薄
HSSFWorkbook workbook = <span style="color: #0000ff;">new<span style="color: #000000;"> HSSFWorkbook();
<span style="color: #008000;">//<span style="color: #008000;"> 生成一个表格
HSSFSheet sheet =<span style="color: #000000;"> workbook.createSheet();
</span><span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> i = 0; i < datalist.length; i++<span style="color: #000000;">) {
String[] r </span>=<span style="color: #000000;"> datalist[i];
HSSFRow row </span>=<span style="color: #000000;"> sheet.createRow(i);
</span><span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> j = 0; j < r.length; j++<span style="color: #000000;">) {
HSSFCell cell </span>=<span style="color: #000000;"> row.createCell(j);
</span><span style="color: #008000;">//</span><span style="color: #008000;">cell max length 32767</span>
<span style="color: #0000ff;">if</span> (r[j].length() > 32767<span style="color: #000000;">) {
r[j] </span>= "--此字段过长(超过32767),已被截断--" +<span style="color: #000000;"> r[j];
r[j] </span>= r[j].substring(0,32766<span style="color: #000000;">);
}
cell.setCellValue(r[j]);
}
}
</span><span style="color: #008000;">//</span><span style="color: #008000;">自动列宽</span>
<span style="color: #0000ff;">if</span> (datalist.length > 0<span style="color: #000000;">) {
</span><span style="color: #0000ff;">int</span> colcount = datalist[0<span style="color: #000000;">].length;
</span><span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> i = 0; i < colcount; i++<span style="color: #000000;">) {
sheet.autoSizeColumn(i);
}
}
workbook.write(out);
} </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (IOException e) {
LG.error(e.toString(),e);
}
}
<span style="color: #008000;">/**<span style="color: #008000;">
- 利用JAVA的反射机制,将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
- 用于多个sheet
-
- <span style="color: #808080;">@param<span style="color: #008000;">
- <span style="color: #808080;">@param<span style="color: #008000;"> sheets {<span style="color: #808080;">@link<span style="color: #008000;"> ExcelSheet}的集合
- <span style="color: #808080;">@param<span style="color: #008000;"> out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
<span style="color: #008000;">*/
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void exportExcel(List<ExcelSheet><span style="color: #000000;"> sheets,OutputStream out) {
exportExcel(sheets,<span style="color: #0000ff;">null<span style="color: #000000;">);
}
<span style="color: #008000;">/**<span style="color: #008000;">
- 利用JAVA的反射机制,将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
- 用于多个sheet
-
- <span style="color: #808080;">@param<span style="color: #008000;">
- <span style="color: #808080;">@param<span style="color: #008000;"> sheets {<span style="color: #808080;">@link<span style="color: #008000;"> ExcelSheet}的集合
- <span style="color: #808080;">@param<span style="color: #008000;"> out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
- <span style="color: #808080;">@param<span style="color: #008000;"> pattern 如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
<span style="color: #008000;">*/
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void exportExcel(List<ExcelSheet><span style="color: #000000;"> sheets,String pattern) {
<span style="color: #0000ff;">if<span style="color: #000000;"> (CollectionUtils.isEmpty(sheets)) {
<span style="color: #0000ff;">return<span style="color: #000000;">;
}
<span style="color: #008000;">//<span style="color: #008000;"> 声明一个工作薄
HSSFWorkbook workbook = <span style="color: #0000ff;">new<span style="color: #000000;"> HSSFWorkbook();
<span style="color: #0000ff;">for (ExcelSheet<span style="color: #000000;"> sheet : sheets) {
<span style="color: #008000;">//<span style="color: #008000;"> 生成一个表格
HSSFSheet hssfSheet =<span style="color: #000000;"> workbook.createSheet(sheet.getSheetName());
write2Sheet(hssfSheet,sheet.getHeaders(),sheet.getDataset(),pattern);
}
<span style="color: #0000ff;">try<span style="color: #000000;"> {
workbook.write(out);
} <span style="color: #0000ff;">catch<span style="color: #000000;"> (IOException e) {
LG.error(e.toString(),e);
}
}
<span style="color: #008000;">/**<span style="color: #008000;">
-
每个sheet的写入
-
-
<span style="color: #808080;">@param<span style="color: #008000;"> sheet 页签
-
<span style="color: #808080;">@param<span style="color: #008000;"> headers 表头
-
<span style="color: #808080;">@param<span style="color: #008000;"> dataset 数据集合
-
<span style="color: #808080;">@param<span style="color: #008000;"> pattern 日期格式
<span style="color: #008000;">*/
<span style="color: #0000ff;">private <span style="color: #0000ff;">static <span style="color: #0000ff;">void write2Sheet(HSSFSheet sheet,String[] headers,String pattern) {
<span style="color: #008000;">//<span style="color: #008000;"> 产生表格标题行
HSSFRow row = sheet.createRow(0<span style="color: #000000;">);
<span style="color: #0000ff;">for (<span style="color: #0000ff;">int i = 0; i < headers.length; i++<span style="color: #000000;">) {
HSSFCell cell =<span style="color: #000000;"> row.createCell(i);
HSSFRichTextString text = <span style="color: #0000ff;">new<span style="color: #000000;"> HSSFRichTextString(headers[i]);
cell.setCellValue(text);
}
<span style="color: #008000;">//<span style="color: #008000;"> 遍历集合数据,产生数据行
Iterator it =<span style="color: #000000;"> dataset.iterator();
<span style="color: #0000ff;">int index = 0<span style="color: #000000;">;
<span style="color: #0000ff;">while<span style="color: #000000;"> (it.hasNext()) {
index++<span style="color: #000000;">;
row =<span style="color: #000000;"> sheet.createRow(index);
T t =<span style="color: #000000;"> (T) it.next();
<span style="color: #0000ff;">try<span style="color: #000000;"> {
<span style="color: #0000ff;">if (t <span style="color: #0000ff;">instanceof<span style="color: #000000;"> Map) {
@SuppressWarnings("unchecked"<span style="color: #000000;">)
Map<String,Object> map = (Map<String,Object><span style="color: #000000;">) t;
<span style="color: #0000ff;">int cellNum = 0<span style="color: #000000;">;
<span style="color: #0000ff;">for<span style="color: #000000;"> (String k : headers) {
<span style="color: #0000ff;">if (map.containsKey(k) == <span style="color: #0000ff;">false<span style="color: #000000;">) {
LG.error("Map 中 不存在 key [" + k + "]"<span style="color: #000000;">);
<span style="color: #0000ff;">continue<span style="color: #000000;">;
}
Object value =<span style="color: #000000;"> map.get(k);
HSSFCell cell =<span style="color: #000000;"> row.createCell(cellNum);
cell.setCellValue(String.valueOf(value));
cellNum++<span style="color: #000000;">;
}
} <span style="color: #0000ff;">else<span style="color: #000000;"> {
List fields =<span style="color: #000000;"> sortFieldByAnno(t.getClass());
<span style="color: #0000ff;">int cellNum = 0<span style="color: #000000;">;
<span style="color: #0000ff;">for (<span style="color: #0000ff;">int i = 0; i < fields.size(); i++<span style="color: #000000;">) {
HSSFCell cell =<span style="color: #000000;"> row.createCell(cellNum);
Field field =<span style="color: #000000;"> fields.get(i).getField();
field.setAccessible(<span style="color: #0000ff;">true<span style="color: #000000;">);
Object value =<span style="color: #000000;"> field.get(t);
String textValue = <span style="color: #0000ff;">null<span style="color: #000000;">;
<span style="color: #0000ff;">if (value <span style="color: #0000ff;">instanceof<span style="color: #000000;"> Integer) {
<span style="color: #0000ff;">int intValue =<span style="color: #000000;"> (Integer) value;
cell.setCellValue(intValue);
} <span style="color: #0000ff;">else <span style="color: #0000ff;">if (value <span style="color: #0000ff;">instanceof<span style="color: #000000;"> Float) {
<span style="color: #0000ff;">float fValue =<span style="color: #000000;"> (Float) value;
cell.setCellValue(fValue);
} <span style="color: #0000ff;">else <span style="color: #0000ff;">if (value <span style="color: #0000ff;">instanceof<span style="color: #000000;"> Double) {
<span style="color: #0000ff;">double dValue =<span style="color: #000000;"> (Double) value;
cell.setCellValue(dValue);
} <span style="color: #0000ff;">else <span style="color: #0000ff;">if (value <span style="color: #0000ff;">instanceof<span style="color: #000000;"> Long) {
<span style="color: #0000ff;">long longValue =<span style="color: #000000;"> (Long) value;
cell.setCellValue(longValue);
} <span style="color: #0000ff;">else <span style="color: #0000ff;">if (value <span style="color: #0000ff;">instanceof<span style="color: #000000;"> Boolean) {
<span style="color: #0000ff;">boolean bValue =<span style="color: #000000;"> (Boolean) value;
cell.setCellValue(bValue);
} <span style="color: #0000ff;">else <span style="color: #0000ff;">if (value <span style="color: #0000ff;">instanceof<span style="color: #000000;"> Date) {
Date date =<span style="color: #000000;"> (Date) value;
SimpleDateFormat sdf = <span style="color: #0000ff;">new<span style="color: #000000;"> SimpleDateFormat(pattern);
textValue =<span style="color: #000000;"> sdf.format(date);
} <span style="color: #0000ff;">else <span style="color: #0000ff;">if (value <span style="color: #0000ff;">instanceof<span style="color: #000000;"> String[]) {
String[] strArr =<span style="color: #000000;"> (String[]) value;
<span style="color: #0000ff;">for (<span style="color: #0000ff;">int j = 0; j < strArr.length; j++<span style="color: #000000;">) {
String str =<span style="color: #000000;"> strArr[j];
cell.setCellValue(str);
<span style="color: #0000ff;">if (j != strArr.length - 1<span style="color: #000000;">) {
cellNum++<span style="color: #000000;">;
cell =<span style="color: #000000;"> row.createCell(cellNum);
}
}
} <span style="color: #0000ff;">else <span style="color: #0000ff;">if (value <span style="color: #0000ff;">instanceof<span style="color: #000000;"> Double[]) {
Double[] douArr =<span style="color: #000000;"> (Double[]) value;
<span style="color: #0000ff;">for (<span style="color: #0000ff;">int j = 0; j < douArr.length; j++<span style="color: #000000;">) {
Double val =<span style="color: #000000;"> douArr[j];
<span style="color: #008000;">//<span style="color: #008000;"> 资料不为空则set Value
<span style="color: #0000ff;">if (val != <span style="color: #0000ff;">null<span style="color: #000000;">) {
cell.setCellValue(val);
}
</span><span style="color: #0000ff;">if</span> (j != douArr.length - 1<span style="color: #000000;">) {
cellNum</span>++<span style="color: #000000;">;
cell </span>=<span style="color: #000000;"> row.createCell(cellNum);
}
}
} </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 其它数据类型都当作字符串简单处理</span>
String empty =<span style="color: #000000;"> StringUtils.EMPTY;
ExcelCell anno </span>= field.getAnnotation(ExcelCell.<span style="color: #0000ff;">class</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">if</span> (anno != <span style="color: #0000ff;">null</span><span style="color: #000000;">) {
empty </span>=<span style="color: #000000;"> anno.defaultValue();
}
textValue </span>= value == <span style="color: #0000ff;">null</span> ?<span style="color: #000000;"> empty : value.toString();
}
</span><span style="color: #0000ff;">if</span> (textValue != <span style="color: #0000ff;">null</span><span style="color: #000000;">) {
HSSFRichTextString richString </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> HSSFRichTextString(textValue);
cell.setCellValue(richString);
}
cellNum</span>++<span style="color: #000000;">;
}
}
} </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e) {
LG.error(e.toString(),e);
}
}
<span style="color: #008000;">//<span style="color: #008000;"> 设定自动宽度
<span style="color: #0000ff;">for (<span style="color: #0000ff;">int i = 0; i < headers.length; i++<span style="color: #000000;">) {
sheet.autoSizeColumn(i);
}
}
<span style="color: #008000;">/**<span style="color: #008000;">
-
把Excel的数据封装成voList
-
-
<span style="color: #808080;">@param<span style="color: #008000;"> clazz vo的Class
-
<span style="color: #808080;">@param<span style="color: #008000;"> inputStream excel输入流
-
<span style="color: #808080;">@param<span style="color: #008000;"> pattern 如果有时间数据,设定输入格式。默认为"yyy-MM-dd"
-
<span style="color: #808080;">@param<span style="color: #008000;"> logs 错误log集合
-
<span style="color: #808080;">@param<span style="color: #008000;"> arrayCount 如果vo中有数组类型,那就按照index顺序,把数组应该有几个值写上.
-
<span style="color: #808080;">@return<span style="color: #008000;"> voList
-
<span style="color: #808080;">@throws<span style="color: #008000;"> RuntimeException
<span style="color: #008000;">*/<span style="color: #000000;">
@SuppressWarnings("unchecked"<span style="color: #000000;">)
<span style="color: #0000ff;">public <span style="color: #0000ff;">static Collection importExcel(Class<span style="color: #000000;"> clazz,InputStream inputStream,String pattern,ExcelLogs logs,Integer... arrayCount) {
HSSFWorkbook workBook = <span style="color: #0000ff;">null<span style="color: #000000;">;
<span style="color: #0000ff;">try<span style="color: #000000;"> {
workBook = <span style="color: #0000ff;">new<span style="color: #000000;"> HSSFWorkbook(inputStream);
} <span style="color: #0000ff;">catch<span style="color: #000000;"> (IOException e) {
LG.error(e.toString(),e);
}
List list = <span style="color: #0000ff;">new ArrayList<span style="color: #000000;">();
HSSFSheet sheet = workBook.getSheetAt(0<span style="color: #000000;">);
Iterator rowIterator =<span style="color: #000000;"> sheet.rowIterator();
<span style="color: #0000ff;">try<span style="color: #000000;"> {
List logList = <span style="color: #0000ff;">new ArrayList<span style="color: #000000;">();
<span style="color: #008000;">//<span style="color: #008000;"> Map<title,index>
Map<String,Integer> titleMap = <span style="color: #0000ff;">new HashMap<><span style="color: #000000;">();
</span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (rowIterator.hasNext()) {
Row row </span>=<span style="color: #000000;"> rowIterator.next();
</span><span style="color: #0000ff;">if</span> (row.getRowNum() == 0<span style="color: #000000;">) {
</span><span style="color: #0000ff;">if</span> (clazz == Map.<span style="color: #0000ff;">class</span><span style="color: #000000;">) {
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 解析map用的key,就是excel标题行</span>
Iterator<Cell> cellIterator =<span style="color: #000000;"> row.cellIterator();
Integer index </span>= 0<span style="color: #000000;">;
</span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (cellIterator.hasNext()) {
String value </span>=<span style="color: #000000;"> cellIterator.next().getStringCellValue();
titleMap.put(value,index);
index</span>++<span style="color: #000000;">;
}
}
</span><span style="color: #0000ff;">continue</span><span style="color: #000000;">;
}
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 整行都空,就跳过</span>
<span style="color: #0000ff;">boolean</span> allRowIsNull = <span style="color: #0000ff;">true</span><span style="color: #000000;">;
Iterator</span><Cell> cellIterator =<span style="color: #000000;"> row.cellIterator();
</span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (cellIterator.hasNext()) {
Object cellValue </span>=<span style="color: #000000;"> getCellValue(cellIterator.next());
</span><span style="color: #0000ff;">if</span> (cellValue != <span style="color: #0000ff;">null</span><span style="color: #000000;">) {
allRowIsNull </span>= <span style="color: #0000ff;">false</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;
}
}
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (allRowIsNull) {
LG.warn(</span>"Excel row " + row.getRowNum() + " all row value is null!"<span style="color: #000000;">);
</span><span style="color: #0000ff;">continue</span><span style="color: #000000;">;
}
T t </span>= <span style="color: #0000ff;">null</span><span style="color: #000000;">;
StringBuilder log </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> StringBuilder();
</span><span style="color: #0000ff;">if</span> (clazz == Map.<span style="color: #0000ff;">class</span><span style="color: #000000;">) {
Map</span><String,Object> map = <span style="color: #0000ff;">new</span> HashMap<String,Object><span style="color: #000000;">();
</span><span style="color: #0000ff;">for</span><span style="color: #000000;"> (String k : titleMap.keySet()) {
Integer index </span>=<span style="color: #000000;"> titleMap.get(k);
String value </span>=<span style="color: #000000;"> row.getCell(index).getStringCellValue();
map.put(k,value);
}
list.add((T) map);
} </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {
t </span>=<span style="color: #000000;"> clazz.newInstance();
</span><span style="color: #0000ff;">int</span> arrayIndex = 0;<span style="color: #008000;">//</span><span style="color: #008000;"> 标识当前第几个数组了</span>
<span style="color: #0000ff;">int</span> cellIndex = 0;<span style="color: #008000;">//</span><span style="color: #008000;"> 标识当前读到这一行的第几个cell了</span>
List<FieldForSortting> fields =<span style="color: #000000;"> sortFieldByAnno(clazz);
</span><span style="color: #0000ff;">for</span><span style="color: #000000;"> (FieldForSortting ffs : fields) {
Field field </span>=<span style="color: #000000;"> ffs.getField();
field.setAccessible(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (field.getType().isArray()) {
Integer count </span>=<span style="color: #000000;"> arrayCount[arrayIndex];
Object[] value </span>= <span style="color: #0000ff;">null</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">if</span> (field.getType().equals(String[].<span style="color: #0000ff;">class</span><span style="color: #000000;">)) {
value </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> String[count];
} </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 目前只支持String[]和Double[]</span>
value = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Double[count];
}
</span><span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> i = 0; i < count; i++<span style="color: #000000;">) {
Cell cell </span>=<span style="color: #000000;"> row.getCell(cellIndex);
String errMsg </span>=<span style="color: #000000;"> validateCell(cell,field,cellIndex);
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (StringUtils.isBlank(errMsg)) {
value[i] </span>=<span style="color: #000000;"> getCellValue(cell);
} </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {
log.append(errMsg);
log.append(</span>";"<span style="color: #000000;">);
logs.setHasError(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);
}
cellIndex</span>++<span style="color: #000000;">;
}
field.set(t,value);
arrayIndex</span>++<span style="color: #000000;">;
} </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {
Cell cell </span>=<span style="color: #000000;"> row.getCell(cellIndex);
String errMsg </span>=<span style="color: #000000;"> validateCell(cell,cellIndex);
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (StringUtils.isBlank(errMsg)) {
Object value </span>= <span style="color: #0000ff;">null</span><span style="color: #000000;">;
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 处理特殊情况,Excel中的String,转换成Bean的Date</span>
<span style="color: #0000ff;">if</span> (field.getType().equals(Date.<span style="color: #0000ff;">class</span><span style="color: #000000;">)
</span>&& cell.getCellType() ==<span style="color: #000000;"> Cell.CELL_TYPE_STRING) {
Object strDate </span>=<span style="color: #000000;"> getCellValue(cell);
</span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {
value </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> SimpleDateFormat(pattern).parse(strDate.toString());
} </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (ParseException e) {
errMsg </span>=<span style="color: #000000;">
MessageFormat.format(</span>"the cell [{0}] can not be converted to a date "<span style="color: #000000;">,CellReference.convertNumToColString(cell.getColumnIndex()));
}
} </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {
value </span>=<span style="color: #000000;"> getCellValue(cell);
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 处理特殊情况,excel的value为String,且bean中为其他,且defaultValue不为空,那就=defaultValue</span>
ExcelCell annoCell = field.getAnnotation(ExcelCell.<span style="color: #0000ff;">class</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">if</span> (value <span style="color: #0000ff;">instanceof</span> String && !field.getType().equals(String.<span style="color: #0000ff;">class</span><span style="color: #000000;">)
</span>&&<span style="color: #000000;"> StringUtils.isNotBlank(annoCell.defaultValue())) {
value </span>=<span style="color: #000000;"> annoCell.defaultValue();
}
}
field.set(t,value);
}
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (StringUtils.isNotBlank(errMsg)) {
log.append(errMsg);
log.append(</span>";"<span style="color: #000000;">);
logs.setHasError(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);
}
cellIndex</span>++<span style="color: #000000;">;
}
}
list.add(t);
logList.add(</span><span style="color: #0000ff;">new</span> ExcelLog(t,log.toString(),row.getRowNum() + 1<span style="color: #000000;">));
}
}
logs.setLogList(logList);
} <span style="color: #0000ff;">catch<span style="color: #000000;"> (InstantiationException e) {
<span style="color: #0000ff;">throw <span style="color: #0000ff;">new RuntimeException(MessageFormat.format("can not instance class:{0}"<span style="color: #000000;">,clazz.getSimpleName()),e);
} <span style="color: #0000ff;">catch<span style="color: #000000;"> (IllegalAccessException e) {
<span style="color: #0000ff;">throw <span style="color: #0000ff;">new RuntimeException(MessageFormat.format("can not instance class:{0}"<span style="color: #000000;">,e);
}
<span style="color: #0000ff;">return<span style="color: #000000;"> list;
}
<span style="color: #008000;">/**<span style="color: #008000;">
-
驗證Cell類型是否正確
-
-
<span style="color: #808080;">@param<span style="color: #008000;"> cell cell單元格
-
<span style="color: #808080;">@param<span style="color: #008000;"> field 欄位
-
<span style="color: #808080;">@param<span style="color: #008000;"> cellNum 第幾個欄位,用於errMsg
-
<span style="color: #808080;">@return
<span style="color: #008000;">*/
<span style="color: #0000ff;">private <span style="color: #0000ff;">static String validateCell(Cell cell,Field field,<span style="color: #0000ff;">int<span style="color: #000000;"> cellNum) {
String columnName =<span style="color: #000000;"> CellReference.convertNumToColString(cellNum);
String result = <span style="color: #0000ff;">null<span style="color: #000000;">;
Integer[] integers =<span style="color: #000000;"> validateMap.get(field.getType());
<span style="color: #0000ff;">if (integers == <span style="color: #0000ff;">null<span style="color: #000000;">) {
result = MessageFormat.format("Unsupported type [{0}]"<span style="color: #000000;">,field.getType().getSimpleName());
<span style="color: #0000ff;">return<span style="color: #000000;"> result;
}
ExcelCell annoCell = field.getAnnotation(ExcelCell.<span style="color: #0000ff;">class<span style="color: #000000;">);
<span style="color: #0000ff;">if (cell == <span style="color: #0000ff;">null
|| (cell.getCellType() == Cell.CELL_TYPE_STRING &&<span style="color: #000000;"> StringUtils.isBlank(cell
.getStringCellValue()))) {
<span style="color: #0000ff;">if (annoCell != <span style="color: #0000ff;">null && annoCell.valid().allowNull() == <span style="color: #0000ff;">false<span style="color: #000000;">) {
result = MessageFormat.format("the cell [{0}] can not null"<span style="color: #000000;">,columnName);
}
;
} <span style="color: #0000ff;">else <span style="color: #0000ff;">if (cell.getCellType() == Cell.CELL_TYPE_BLANK &&<span style="color: #000000;"> annoCell.valid().allowNull()) {
<span style="color: #0000ff;">return<span style="color: #000000;"> result;
} <span style="color: #0000ff;">else<span style="color: #000000;"> {
List cellTypes =<span style="color: #000000;"> Arrays.asList(integers);
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 如果類型不在指定範圍內,並且沒有默認值</span>
<span style="color: #0000ff;">if</span> (!<span style="color: #000000;">(cellTypes.contains(cell.getCellType()))
</span>||<span style="color: #000000;"> StringUtils.isNotBlank(annoCell.defaultValue())
</span>&& cell.getCellType() ==<span style="color: #000000;"> Cell.CELL_TYPE_STRING) {
StringBuilder strType </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> StringBuilder();
</span><span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> i = 0; i < cellTypes.size(); i++<span style="color: #000000;">) {
Integer intType </span>=<span style="color: #000000;"> cellTypes.get(i);
strType.append(getCellTypeByInt(intType));
</span><span style="color: #0000ff;">if</span> (i != cellTypes.size() - 1<span style="color: #000000;">) {
strType.append(</span>","<span style="color: #000000;">);
}
}
result </span>=<span style="color: #000000;">
MessageFormat.format(</span>"the cell [{0}] type must [{1}]"<span style="color: #000000;">,columnName,strType.toString());
} </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 类型符合验证,但值不在要求范围内的
</span><span style="color: #008000;">//</span><span style="color: #008000;"> String in</span>
<span style="color: #0000ff;">if</span> (annoCell.valid().in().length != 0 && cell.getCellType() ==<span style="color: #000000;"> Cell.CELL_TYPE_STRING) {
String[] in </span>=<span style="color: #000000;"> annoCell.valid().in();
String cellValue </span>=<span style="color: #000000;"> cell.getStringCellValue();
</span><span style="color: #0000ff;">boolean</span> isIn = <span style="color: #0000ff;">false</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">for</span><span style="color: #000000;"> (String str : in) {
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (str.equals(cellValue)) {
isIn </span>= <span style="color: #0000ff;">true</span><span style="color: #000000;">;
}
}
</span><span style="color: #0000ff;">if</span> (!<span style="color: #000000;">isIn) {
result </span>= MessageFormat.format("the cell [{0}] value must in {1}"<span style="color: #000000;">,in);
}
}
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 数字型</span>
<span style="color: #0000ff;">if</span> (cell.getCellType() ==<span style="color: #000000;"> Cell.CELL_TYPE_NUMERIC) {
</span><span style="color: #0000ff;">double</span> cellValue =<span style="color: #000000;"> cell.getNumericCellValue();
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 小于</span>
<span style="color: #0000ff;">if</span> (!<span style="color: #000000;">Double.isNaN(annoCell.valid().lt())) {
</span><span style="color: #0000ff;">if</span> (!(cellValue <<span style="color: #000000;"> annoCell.valid().lt())) {
result </span>=<span style="color: #000000;">
MessageFormat.format(</span>"the cell [{0}] value must less than [{1}]"<span style="color: #000000;">,annoCell.valid().lt());
}
}
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 大于</span>
<span style="color: #0000ff;">if</span> (!<span style="color: #000000;">Double.isNaN(annoCell.valid().gt())) {
</span><span style="color: #0000ff;">if</span> (!(cellValue ><span style="color: #000000;"> annoCell.valid().gt())) {
result </span>=<span style="color: #000000;">
MessageFormat.format(</span>"the cell [{0}] value must greater than [{1}]"<span style="color: #000000;">,annoCell.valid().gt());
}
}
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 小于等于</span>
<span style="color: #0000ff;">if</span> (!<span style="color: #000000;">Double.isNaN(annoCell.valid().le())) {
</span><span style="color: #0000ff;">if</span> (!(cellValue <=<span style="color: #000000;"> annoCell.valid().le())) {
result </span>=<span style="color: #000000;">
MessageFormat.format(</span>"the cell [{0}] value must less than or equal [{1}]"<span style="color: #000000;">,annoCell.valid().le());
}
}
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 大于等于</span>
<span style="color: #0000ff;">if</span> (!<span style="color: #000000;">Double.isNaN(annoCell.valid().ge())) {
</span><span style="color: #0000ff;">if</span> (!(cellValue >=<span style="color: #000000;"> annoCell.valid().ge())) {
result </span>=<span style="color: #000000;">
MessageFormat.format(</span>"the cell [{0}] value must greater than or equal [{1}]"<span style="color: #000000;">,annoCell.valid().ge());
}
}
}
}
}
<span style="color: #0000ff;">return<span style="color: #000000;"> result;
}
<span style="color: #008000;">/**<span style="color: #008000;">
- 根据annotation的seq排序后的栏位
-
- <span style="color: #808080;">@param<span style="color: #008000;"> clazz
- <span style="color: #808080;">@return
<span style="color: #008000;">*/
<span style="color: #0000ff;">private <span style="color: #0000ff;">static List sortFieldByAnno(Class<?><span style="color: #000000;"> clazz) {
Field[] fieldsArr =<span style="color: #000000;"> clazz.getDeclaredFields();
List fields = <span style="color: #0000ff;">new ArrayList<span style="color: #000000;">();
List annoNullFields = <span style="color: #0000ff;">new ArrayList<span style="color: #000000;">();
<span style="color: #0000ff;">for<span style="color: #000000;"> (Field field : fieldsArr) {
ExcelCell ec = field.getAnnotation(ExcelCell.<span style="color: #0000ff;">class<span style="color: #000000;">);
<span style="color: #0000ff;">if (ec == <span style="color: #0000ff;">null<span style="color: #000000;">) {
<span style="color: #008000;">//<span style="color: #008000;"> 没有ExcelCell Annotation 视为不汇入
<span style="color: #0000ff;">continue<span style="color: #000000;">;
}
<span style="color: #0000ff;">int id =<span style="color: #000000;"> ec.index();
fields.add(<span style="color: #0000ff;">new<span style="color: #000000;"> FieldForSortting(field,id));
}
fields.addAll(annoNullFields);
sortByProperties(fields,<span style="color: #0000ff;">true,<span style="color: #0000ff;">false,"index"<span style="color: #000000;">);
<span style="color: #0000ff;">return<span style="color: #000000;"> fields;
}
@SuppressWarnings("unchecked"<span style="color: #000000;">)
<span style="color: #0000ff;">private <span style="color: #0000ff;">static <span style="color: #0000ff;">void sortByProperties(List<? <span style="color: #0000ff;">extends Object> list,<span style="color: #0000ff;">boolean<span style="color: #000000;"> isNullHigh,<span style="color: #0000ff;">boolean<span style="color: #000000;"> isReversed,String... props) {
<span style="color: #0000ff;">if<span style="color: #000000;"> (CollectionUtils.isNotEmpty(list)) {
Comparator<?> typeComp =<span style="color: #000000;"> ComparableComparator.getInstance();
<span style="color: #0000ff;">if (isNullHigh == <span style="color: #0000ff;">true<span style="color: #000000;">) {
typeComp =<span style="color: #000000;"> ComparatorUtils.nullHighComparator(typeComp);
} <span style="color: #0000ff;">else<span style="color: #000000;"> {
typeComp =<span style="color: #000000;"> ComparatorUtils.nullLowComparator(typeComp);
}
<span style="color: #0000ff;">if<span style="color: #000000;"> (isReversed) {
typeComp =<span style="color: #000000;"> ComparatorUtils.reversedComparator(typeComp);
}
List</span><Object> sortCols = <span style="color: #0000ff;">new</span> ArrayList<Object><span style="color: #000000;">();
</span><span style="color: #0000ff;">if</span> (props != <span style="color: #0000ff;">null</span><span style="color: #000000;">) {
</span><span style="color: #0000ff;">for</span><span style="color: #000000;"> (String prop : props) {
sortCols.add(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> BeanComparator(prop,typeComp));
}
}
</span><span style="color: #0000ff;">if</span> (sortCols.size() > 0<span style="color: #000000;">) {
Comparator</span><Object> sortChain = <span style="color: #0000ff;">new</span><span style="color: #000000;"> ComparatorChain(sortCols);
Collections.sort(list,sortChain);
}
}
}
}
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|