Java后台Excel导出
程序员文章站
2024-03-20 22:15:22
...
开发时需要写一个excel导出的需求,自己就参考了网上的一些方法,然后自己整理了一下。
需要引入的架包
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.14</version>
</dependency>
核心代码
public void exportExcel(String id,HttpServletResponse response) throws IOException {
response.setContentType("application/vnd.ms-excel");
response.setHeader("ContentDisposition","attachment;filename=test.xls");
//声明一个工作薄
HSSFWorkbook workbook = new HSSFWorkbook();
OutputStream outputStream = response.getOutputStream();
HSSFSheet sheet = workbook.createSheet("test数据");
// 设置表格默认列宽度为15个字节
sheet.setDefaultColumnWidth((short) 15);
//如果想设置表格宽度为自适应,把下面这段代码放在tryCatch上面
/*for (int i = 0; i < titles.size(); i++) {
sheet.autoSizeColumn(i);
}*/
// 生成一个样式
HSSFCellStyle style = workbook.createCellStyle();
// 设置这些样式
style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 生成一个字体
HSSFFont font = workbook.createFont();
font.setFontHeightInPoints((short) 12);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
// 把字体应用到当前的样式
style.setFont(font);
// 生成并设置另一个样式
HSSFCellStyle style2 = workbook.createCellStyle();
style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
// 生成另一个字体
HSSFFont font2 = workbook.createFont();
font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
// 把字体应用到当前的样式
style2.setFont(font2);
HSSFRow row0 = sheet.createRow(0);
HSSFCell cell00 = row0.createCell(0);
HSSFCell cell01 = row0.createCell(1);
HSSFCell cell02 = row0.createCell(2);
cell00.setCellStyle(style);
cell01.setCellStyle(style);
cell02.setCellStyle(style);
HSSFRichTextString text00 = new HSSFRichTextString("Name");
HSSFRichTextString text01 = new HSSFRichTextString("Age");
HSSFRichTextString text02 = new HSSFRichTextString("Sex");
cell00.setCellValue(text00);
cell01.setCellValue(text01);
cell02.setCellValue(text02);
//这里获取数据
List<JSONObject> data= service.getExcelData(id);
for (int i = 0; i < data.size(); i++) {
HSSFRow row = sheet.createRow(i + 1);
HSSFCell cell0 = row.createCell(0);
HSSFCell cell1 = row.createCell(1);
HSSFCell cell2 = row.createCell(2);
cell0.setCellStyle(style);
cell1.setCellStyle(style);
cell2.setCellStyle(style);
HSSFRichTextString text0 = new HSSFRichTextString(data.get(i).getString("name"));
HSSFRichTextString text1 = new HSSFRichTextString(data.get(i).getString("age"));
HSSFRichTextString text2 = new HSSFRichTextString(data.get(i).getString("sex"));
cell0.setCellValue(text0);
cell1.setCellValue(text1);
cell2.setCellValue(text2);
}
try {
workbook.write(outputStream);
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
HSSFWorkbook这个貌似只支持xls格式导出,如果生成的是xlsx格式的文件,导出完打开时会出现文件错误的问题,为了避免这个问题,声明一个工作薄时把HSSFWorkbook替换为XSSFWorkbook。然后下面设置样式的类文件,凡是HSSF开头的全部换为XSSF开头的类文件。
再贴一段支持导出文件为中文名的代码,且设置导出格式为xlsx。
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmm");
String now = dateFormat.format(new Date());
String agent = request.getHeader("USER-AGENT").toLowerCase();
response.setContentType("application/vnd.ms-excel");
String fileName = “信息表” + now;
String codedFileName = java.net.URLEncoder.encode(fileName, "UTF-8");
if (agent.contains("firefox")) {
response.setCharacterEncoding("utf-8");
response.setHeader("content-disposition", "attachment;filename=" + new String(fileName.getBytes(), "ISO8859-1") + ".xlsx");
} else {
response.setHeader("content-disposition", "attachment;filename=" + codedFileName + ".xlsx");
}
上一篇: 微服务架构-eureka
下一篇: 导出excel,java后台生成