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();

 

posted @ 2022-07-01 15:13  寒末  阅读(130)  评论(0)    收藏  举报