贴一段POI导出代码----POI使用注意事项更新。20170323更新使用

在某台服务器使用SXSSFWorkbook方式报错:No space left on device。没有排查出问题,增加XSSFWorkbook方式,需要更多内存。

【具体原因未找到,磁盘空间足够,为文件分配地址看起来也够,该服务器在做一个工具的测试可能频繁生成小文件,另外top中的vitr选项很高,其他程序不好停,也不方便验证问题,只好作罢】

之前使用XSSFWorkbook导出太多或者太大会内存溢出,换用Workbook workBook = new SXSSFWorkbook(100);

代码概况: 主要传入参数列头和数据【写一个简单通用excel模板】

方法包括:写入excel和追加excel

追加会将excel文件置为空,再写入。

如果大量文件出现频繁追加写入。POI会报一些奇怪的错。所以我在写入excel文件使用一些策略能够较少的使用apped方法,尽量都是创建一个文件将其写完。

并且追加方法会消耗更多的内存,它是将之前的内容读取然后再写入。


import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
 * <p>类名: ExcelUtils</p>
 * <p>描述: excel公共类</p>
 */
public class ExcelUtils {
    
    /**
     * <p>方法名: getCellStyle2007</p>
     * <p>描述: 设置单元格样式</p>
     * @param workbook
     * @return
     */
    public static CellStyle getCellStyle2007(Workbook workBook) {
        // 设置样式
        CellStyle cellStyle = workBook.createCellStyle();// 创建样式
        cellStyle.setAlignment(CellStyle.ALIGN_LEFT);// 居左
        // 边框实线
        cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);// 下边框
        cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);// 左边框
        cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);// 右边框
        cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);// 上边框
        
        //设置自动换行
        cellStyle.setWrapText(true);
        
        return cellStyle;
    }
    
    /**
     * <p>方法名: getTitleCellStyle2007</p>
     * <p>描述: 设置表头单元格样式</p>
     * @param workbook
     * @return
     */
    public static CellStyle getTitleCellStyle2007(Workbook workBook) {
        // 设置样式
        CellStyle cellStyle = workBook.createCellStyle();// 创建样式
        cellStyle.setAlignment(CellStyle.ALIGN_LEFT);// 居左
        // 边框实线
        cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);// 下边框
        cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);// 左边框
        cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);// 右边框
        cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);// 上边框
        
        //背景色
        cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
        cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
        
        //字体
        Font font = workBook.createFont();
        font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);//粗体显示
        cellStyle.setFont(font);
        
        return cellStyle;
    }
    
    /**
     * @描述: 追加excel
     * @说明:
     * @param list
     * @param filePath
     * @return
     * @throws IOException
     */
    public static boolean appendExcel(List<Object[]> list, String filePath) throws IOException{
        
        FileInputStream fs = new FileInputStream(filePath);
        XSSFWorkbook wb = new XSSFWorkbook(fs);        
        XSSFSheet sheet = wb.getSheetAt(0);
        XSSFRow row = sheet.getRow(0);

        //设置单元格样式
        CellStyle cellStyle = ExcelUtils.getCellStyle2007(wb);
        
        FileOutputStream out = new FileOutputStream(filePath); 
        
        int count = sheet.getLastRowNum();
        for(Object[] obj : list){
            count++;
            row = sheet.createRow(count);
            row.setHeight((short)(25*20));
            for(int i = 0; i< obj.length ; i++ ){
                XSSFCell cell = row.createCell(i);
                cell.setCellValue(obj[i] + "");
                cell.setCellStyle(cellStyle);
            }
        }
        out.flush();
        wb.write(out);
        out.close();
        fs.close();
        return true;
    }
    
    
    /**
     * 创建一个标准的sheet  包含表头和内容
     * @param list  String类型数据list
     * @param workBook
     * @param sheetName sheet名
     * @param titleNames 字段名
     */
    private static void createSheet(List<Object[]> list, Workbook workBook, String sheetName, String[] titleNames) {
        Sheet sheet = workBook.createSheet(sheetName);
        if(list !=null && list.size() > 0 && list.get(0).length == titleNames.length){
        }else{
            return;
        }
        
        //设置单元格样式
        CellStyle cellStyle = ExcelUtils.getCellStyle2007(workBook);
        CellStyle titleCellStyle = ExcelUtils.getTitleCellStyle2007(workBook);
        //粗体显示
        CellStyle style = workBook.createCellStyle();
        Font font = workBook.createFont();
        font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
        style.setFont(font);
        
        
        Row row = sheet.createRow(0);
        Cell cell = null;

        sheet.setColumnWidth(0, 14 * 256); 
        for(int i = 0; i < titleNames.length; i++){
            sheet.setColumnWidth(i+1, 25 * 256); 
            
            cell = row.createCell(i);
            cell.setCellValue(titleNames[i]);
            cell.setCellStyle(titleCellStyle);
        }

        int count = 0;
        for(Object[] obj : list){
            count++;
            row = sheet.createRow(count);
            row.setHeight((short)(25*20));
            for(int i = 0; i< obj.length ; i++ ){
                cell = row.createCell(i);
                cell.setCellValue(obj[i] + "");
                cell.setCellStyle(cellStyle);
            }
        }
    }
    
    /**
     * @描述: 生成excel文件
     * @说明:
     * @修改时间: 2016年3月24日 下午5:34:29
     * @param task
     * @param filePath
     * @return
     */
    public static boolean exportExcel(List<Object[]> list, String filePath,String sheetName,String[] titleNames) {

        Workbook workBook = new SXSSFWorkbook(5000); 
        createSheet(list,workBook,sheetName,titleNames);
        
        // 将文件存到指定位置
        FileOutputStream fout = null;
        try {
            fout = new FileOutputStream(filePath);
            workBook.write(fout);
            return true;
        } catch (IOException e) {
            System.out.println("导出失败,原因:" + e);
            return false;
        } finally {
            try {
                if (null != fout) {
                    fout.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    /**
     * @描述: 生成excel文件
     * @说明:
     * @修改时间: 2016年3月24日 下午5:34:29
     * @param task
     * @param filePath
     * @return
     */
    public static boolean exportExcel2(List<Object[]> list, String filePath,String sheetName,String[] titleNames) {

        XSSFWorkbook workBook = new XSSFWorkbook();
        createSheet(list,workBook,sheetName,titleNames);

        // 将文件存到指定位置
        FileOutputStream fout = null;
        try {
            fout = new FileOutputStream(filePath);
            workBook.write(fout);
            return true;
        } catch (IOException e) {
            System.out.println("任务详情导出失败,原因:" + e);
            return false;
        } finally {
            try {
                if (null != fout) {
                    fout.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    public static void main(String[] args) {
        String path = "C:\\Users\\sks\\Desktop\\test.xlsx";
        String [] titleName = new String[]{"原始URL","爬取URL","爬取时间","爬取状态","网站标题","网站关键词","网站description","网页内容","外部链接"};
        Object[] arrayObjTest = new Object[]{"1","2","3","爬取状态","网站标题","网站关键词","网站description","网页内容","外部链接"};;
        Object[] arrayObj = new Object[titleName.length];
        List<Object[]> resultList = new ArrayList<Object[]>();
        arrayObj[0] = "append";
        arrayObj[1] = "test for something";
        resultList.add(arrayObjTest);
        resultList.add(arrayObjTest);
        exportExcel(resultList, path, "测试", titleName);
        
        resultList.add(arrayObj);
        try {
            appendExcel(resultList, path);
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
}






你可能感兴趣的:(贴一段POI导出代码----POI使用注意事项更新。20170323更新使用)