上一篇我们说到Java使用POI操作Excel,对Excel文件进行解析,并将数据导入到数据库中,今天这篇来分享一个Java封装的工具类,将数据库查询到的数据进行Excel形式的导出。
具体的说明都在工具类的注释中,调用该工具类的方法需要传几个参数,一个是导出文件的标题,一个是数据库查出的数据集合,还有一个输出流对象,然后调用该方法就能导出Excel文件。
public static void exportExcptDetails(String sheetTitle,
List<Map<String, String>> columnList,
List<DataModel> valueList, OutputStream out) {
XSSFWorkbook workBook = new XSSFWorkbook();
// 生成一个表格
XSSFSheet sheet = workBook.createSheet(sheetTitle);
// 样式
XSSFCellStyle headerStyle = workBook.createCellStyle();
// 生成一个头部样式 底纹为蓝色,汉字加租,加边框,居中显示
// 设置样式HSSFColor.BLUE_GREY.index
headerStyle.setFillForegroundColor(IndexedColors.BLUE.getIndex());
headerStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
headerStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);
headerStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);
headerStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);
headerStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);
headerStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
// 生成一个字体
XSSFFont font = workBook.createFont();
font.setColor(HSSFColor.WHITE.index);
font.setFontHeightInPoints((short) 11);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
headerStyle.setWrapText(true);
// 把生成的字体给当前的样式使用
headerStyle.setFont(font);
XSSFCellStyle bodystyle = workBook.createCellStyle();
// 生产主体的样式 各列数据居中显示,加边框
bodystyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);
bodystyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);
bodystyle.setBorderRight(XSSFCellStyle.BORDER_THIN);
bodystyle.setBorderTop(XSSFCellStyle.BORDER_THIN);
bodystyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
// 设置表格默认列宽度为20个字节
sheet.setDefaultColumnWidth(20);
// 画图
XSSFDrawing patriarch = sheet.createDrawingPatriarch();
// /:在第一行,插入表头
XSSFRow row = sheet.createRow(0);
XSSFCell cell = null;
Map<String, String> maphead = null;
for (int i = 0; i < columnList.size(); i++) {
// list集合从0开始 故i-1
maphead = columnList.get(i);
cell = row.createCell(Integer.parseInt(maphead.get("ORDERID")
.toString()));
cell.setCellValue(maphead.get("NAME_ZH") == null ? "" : maphead
.get("NAME_ZH").toString());
sheet.setColumnWidth(
i,
(maphead.get("NAME_ZH") == null ? "" : maphead.get(
"NAME_ZH").toString()).getBytes().length * 2 * 256); // 设置自动列宽
// headerStyle.setLocked(true); // 设置锁定
cell.setCellStyle(headerStyle);
}
// 从第二行开始插入数据 i 表示行数,故i=1
XSSFRow rows = null;
// key值
String value = "";
// 列值
String mapValue = "";
// 数据集合列表
DataModel map = null;
// 列信息
Map<String, String> mapBody = null;
//值的集合不为空才进行遍历
if (valueList != null) {
for (int i = 1; i <= valueList.size(); i++) {// 循环查询到的指
// valueList集合从0开始 故i-1
map = (DataModel) valueList.get(i - 1);
rows = sheet.createRow(i);
for (int j = 0; j < columnList.size(); j++) {// 循环取字段 列数
// list集合从0开始 故i-1
mapBody = columnList.get(j);
cell = rows.createCell(Integer.parseInt(mapBody.get("ORDERID")
.toString()));
value = mapBody.get("NAME_EN") == null ? "" : mapBody.get(
"NAME_EN").toString();
mapValue = map.get(value) == null ? "" : map.get(value)
.toString();
cell.setCellValue(mapValue);
// bodystyle.setLocked(true); // 设置锁定
cell.setCellStyle(bodystyle);
}
}
}
try {
workBook.write(out);
out.flush();
out.close();
} catch (Exception e) {
log.error(e.getMessage(), e);
e.printStackTrace();
}
}
类似的还有导出PDF的工具类,以后有用到的场景,再进行分享。