package com.app.mvc.test;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Cell;
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.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Iterator;
@Slf4j
public class TestExcel {
public static void main(String args[]) throws Exception {
readAndCopyExcel();
}
public static void readAndCopyExcel() throws Exception {
/**
* 如果要测试该case, 请先在项目首层(pom.xml相同路径)放置一个test.xlsx文件
* 或者改这里的xlsx文件指定位置的文件
*/
String newFile = "temp.xlsx";
String originFile = "test.xlsx";
Workbook writeWorkbook = new SXSSFWorkbook();
Sheet writeSheet = writeWorkbook.createSheet();
Workbook readWorkBook = new XSSFWorkbook(new FileInputStream(originFile)); // 将指定的excel读取到内存对象中
Sheet readSheet = readWorkBook.getSheetAt(0); // 读取excel第一个sheet
log.info("excel rows : {}", readSheet.getLastRowNum());
for (int index = 0; index < readSheet.getLastRowNum(); index++) { // 遍历excel的每行
try {
Row readRow = readSheet.getRow(index); // 根据行号取出excel的每一行
if (readRow == null) {
break;
}
Iterator<Cell> cellIterator = readRow.cellIterator();
Row writeRow = writeSheet.createRow(index); // 在新的excel文件中添加一行
int temp = 0;
while (cellIterator.hasNext()) { // 迭代遍历excel每行的每一列
Cell curCell = cellIterator.next(); //
if (temp == 0 && curCell == null) { // 处理可能存在的脏数据,这里假设第一列为行号
break;
}
// 在新excel的当前行中添加一个cell
Cell writeRowCell = writeRow.createCell(temp);
writeRowCell.setCellType(curCell.getCellType());
switch (curCell.getCellType()) {
case Cell.CELL_TYPE_NUMERIC:
writeRowCell.setCellValue(curCell.getNumericCellValue());
break;
case Cell.CELL_TYPE_BOOLEAN:
writeRowCell.setCellValue(curCell.getBooleanCellValue());
break;
default:
writeRowCell.setCellValue(curCell.getStringCellValue());
}
temp++;
}
} catch (Exception e) {
log.error("parse excel exception, row: {}", index, e);
throw e;
}
}
log.info("generate new excel");
FileOutputStream newExcel = new FileOutputStream(newFile);
try {
writeWorkbook.write(newExcel);
} finally {
newExcel.flush();
newExcel.close();
}
}
}