使用POI3.12分割純文本Excel文件 支持XLSX\XLS文件類型,支持分割成定文件長度和定文件數量兩種。java
PS:生成XLS文件打開時顯示文件可能已損壞 不知是何緣由 求解....apache
package com.sgmder.java; import java.io.FileInputStream; import java.io.FileOutputStream; import java.text.DecimalFormat; import java.util.LinkedList; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFWorkbook; 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.usermodel.XSSFWorkbook; /** * 分割Excel文件 * * @author sgmder * @version 0.1 * */ public class SplitExcelOne2More { private String fileName; private Workbook workBook; private String title; public static void main(String[] arg) throws Exception { SplitExcelOne2More rw = new SplitExcelOne2More("C:\\test.xlsx"); // System.out.println(rw.getExcelContent()); // 文件長度固定 // List<Workbook> list = rw.splitExcelByLength(1); // 文件個數固定 List<Workbook> list = rw.splitExcelByNum(10); int x = 1; for (Workbook workBook : list) { FileOutputStream fOut = new FileOutputStream("C:\\test\\SplitFile" + x++ + ".xlsx"); workBook.write(fOut); fOut.flush(); fOut.close(); } } public SplitExcelOne2More(String fileName) { this.fileName = fileName; } /** * 獲取工做簿 * * @return * @throws Exception */ private Workbook getWorkbook() { if (workBook == null) { try { if (fileName.substring(fileName.lastIndexOf('.') + 1) .equalsIgnoreCase("xlsx")) { workBook = new XSSFWorkbook(new FileInputStream(fileName)); } else if (fileName.substring(fileName.lastIndexOf('.') + 1) .equalsIgnoreCase("xls")) { workBook = new HSSFWorkbook(new FileInputStream(fileName)); } else { throw new IllegalArgumentException("非EXCEL文件類型!"); } } catch (Exception e) { e.printStackTrace(); } } return workBook; } /** * 文件長度固定 分割EXCEL文件 * * @param length * @return */ public List<Workbook> splitExcelByLength(int length) { List<Workbook> bookList = new LinkedList<Workbook>(); int rows = getWorkbook().getSheetAt(0).getLastRowNum(); int count = rows / length; return NewWorkbook(length, bookList, rows, count); } /** * 文件個數固定 分割EXCEL文件 * * @param count * @return */ public List<Workbook> splitExcelByNum(int count) { List<Workbook> bookList = new LinkedList<Workbook>(); int rows = getWorkbook().getSheetAt(0).getLastRowNum(); count = rows % count != 0 ? count - 1 : count; int length = rows / count; return NewWorkbook(length, bookList, rows, count); } /** * 獲取WorkbookList * * @param length * @param bookList * @param rows * @param count * @return */ private List<Workbook> NewWorkbook(int length, List<Workbook> bookList, int rows, int count) { for (int x = 1; x <= count; x++) { bookList.add(getNewWorkbook(getTitle() + getExcelContent((x - 1) * length + 1, x * length))); } if (rows % length != 0) { bookList.add(getNewWorkbook(getTitle() + getExcelContent(count * length + 1, rows))); } return bookList; } /** * 獲取Excel內容 * * @param startNum * @return */ public String getExcelContent(int... startNum) { int start = startNum.length > 0 ? startNum[0] : 0; int end = startNum.length > 1 ? startNum[1] > getWorkbook().getSheetAt( 0).getLastRowNum() ? getWorkbook().getSheetAt(0) .getLastRowNum() : startNum[1] : getWorkbook().getSheetAt(0) .getLastRowNum(); StringBuffer sb = new StringBuffer(); while (start <= end) { sb.append(getRowValue(start++)); } return sb.toString(); } /** * 獲取一行數據 * * @param rowNum * @return */ public String getRowValue(int rowNum) { Sheet sheet = getWorkbook().getSheetAt(0); Row row = sheet.getRow(rowNum); int cellNum = row.getLastCellNum(); StringBuffer result = new StringBuffer(); for (int j = 0; j < cellNum; j++) { if (row.getCell((short) j) != null) { if (row.getCell((short) j).getCellType() == 1) { result.append(row.getCell((short) j).getStringCellValue()); } else if (row.getCell((short) j).getCellType() == 0) { DecimalFormat df = new DecimalFormat("0"); String strCell = df.format(row.getCell((short) j) .getNumericCellValue()); result.append(strCell); } } result.append("\t"); } result.setLength(result.length() - 1); result.append("\n"); return result.toString(); } /** * 獲取新的Workbook * * @param ExcelContent * @return */ public Workbook getNewWorkbook(String ExcelContent) { Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet(); String[] rows = ExcelContent.split("\n"); for (int i = 0; i < rows.length; i++) { Row row = sheet.createRow((short) i); String[] cells = rows[i].split("\t"); for (int j = 0; j < cells.length; j++) { Cell cell = row.createCell((short) j); cell.setCellType(Cell.CELL_TYPE_STRING); cell.setCellValue(cells[j]); } } return workbook; } /** * 獲取列頭 * * @return */ public String getTitle() { return title == null ? getRowValue(0) : title; } }