JAVA的excel多sheet导出
csv无法多sheet,JavaPOI导出excel有三种形式:HSSFworkbook,XSSFworkbook,SXSSFworkbook
区别如下:
1-HSSFworkbook
1.操作Excel2003以前(包括2003)的版本,扩展名是.xls;
2.行数限制是65535,超出会报错。
3.数据在内存,数据量小一般不会OOM。
2-XSSFworkbook
1.操作Excel2007后的版本,扩展名是.xlsx;
2.1048576行,16384列;
3.数据在内存,数据量大会OOM,占内存大。
3-SXSSFworkbook
基于XSSFworkbook但是低内存占用,确保数据量大不会OOM。
它的原理很简单,用硬盘空间换内存(就像hash map用空间换时间一样)。
SXSSFWorkbook是streaming版本的XSSFWorkbook,它只会保存最新的excel rows在内存里供查看,在此之前的excel rows都会被写入到硬盘里(Windows电脑的话,是写入到C盘根目录下的temp文件夹)。被写入到硬盘里的rows是不可见的/不可访问的。只有还保存在内存里的才可以被访问到。
SXSSF与XSSF的对比:
a. 在一个时间点上,只可以访问一定数量的数据
b. 不再支持Sheet.clone()
c. 不再支持公式的求值
d. 在使用Excel模板下载数据时将不能动态改变表头,因为这种方式已经提前把excel写到硬盘的了就不能再改了
本次示例是HSSFworkbook:
工具类ExcelUtiNew如下:
public class ExcelUtilNew { /** * @Title: exportExcel * @Description: 导出Excel的方法 * @param workbook * @param sheetNum (sheet的位置,0表示第一个表格中的第一个sheet) * @param sheetTitle (sheet的名称) * @param headers (表格的标题) * @param result (表格的数据) * @param out (输出流) * @throws Exception */ public Boolean exportExcel(HSSFWorkbook workbook, int sheetNum, String sheetTitle, String[] headers, List<List<String>> result, OutputStream out) { Boolean res = false ; try{ // 生成一个表格 HSSFSheet sheet = workbook.createSheet(); workbook.setSheetName(sheetNum, sheetTitle); // 设置表格默认列宽度为20个字节 sheet.setDefaultColumnWidth((short) 20); // 生成一个样式 CellStyle style = workbook.createCellStyle(); // 设置这些样式 style.setAlignment(HorizontalAlignment.CENTER); style.setVerticalAlignment(VerticalAlignment.CENTER); style.setBorderRight(BorderStyle.THIN); style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); style.setBorderLeft(BorderStyle.THIN); style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); style.setBorderTop(BorderStyle.THIN); style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); style.setBorderBottom(BorderStyle.THIN); style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); style.setFillForegroundColor(HSSFColor.PALE_BLUE.index); style.setFillPattern(FillPatternType.SOLID_FOREGROUND); // 生成一个字体 Font headerFont = workbook.createFont(); headerFont.setFontName("Arial"); headerFont.setFontHeightInPoints((short) 10); headerFont.setBold(true); headerFont.setColor(IndexedColors.WHITE.getIndex()); // 把字体应用到当前的样式 style.setFont(headerFont); // 指定当单元格内容显示不下时自动换行 style.setWrapText(true); // 产生表格标题行 HSSFRow row = sheet.createRow(0); for (int i = 0; i < headers.length; i++) { HSSFCell cell = row.createCell((short) i); cell.setCellStyle(style); HSSFRichTextString text = new HSSFRichTextString(headers[i]); cell.setCellValue(text.toString()); } // 遍历集合数据,产生数据行 if (result != null) { int index = 1; for (List<String> m : result) { row = sheet.createRow(index); int cellIndex = 0; for (String str : m) { HSSFCell cell = row.createCell((short) cellIndex); cell.setCellValue(str.toString()); cellIndex++; } index++; } } res = true; }catch (Exception e){ e.printStackTrace(); } return res;
具体的代码实现显示:
1 String[] headersApt = { "单位", "被控端IP数量","感染占比","较上月重复感染IP","重复感染占比" }; 2 String[] headersReApt = { "日期", "被控端IP地址","远控域名","单位" }; 3 String[] headersHitApt = { "单位", "被控端IP地址","日期","远控域名" }; 4 ExcelUtilNew eeu = new ExcelUtilNew(); 5 HSSFWorkbook workbook2 = new HSSFWorkbook(); 6 eeu.exportExcel(workbook2, 0, "APT清单", headersReApt, dataApt, out); 7 eeu.exportExcel(workbook2, 1, "较上个月重复感染清单", headersHitApt, dataReApt, out); 8 eeu.exportExcel(workbook2, 2, "内置APT处置情况", headersApt, data, out); 9 //原理就是将所有的数据一起写入,然后再关闭输入流。 10 workbook2.write(out); 11 out.close();

浙公网安备 33010602011771号