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