在某台服务器使用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(); } } }