标签:try r++ ret read 磁盘 nice tar 限制 arraylist
依赖:
<!--xls(03)--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <!--xlsx(07)--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency>
导出操作,即使用 Java 写出数据到 Excel 中,常见场景是将页面上的数据导出,这些数据可能是财务数据,也可能是商品数据,生成 Excel 后返回给用户下载文件。
在 poi 工具库中,导出 api 可以分三种方式
.xls
,优点是导出数据速度快,但是最多65536行数据.xlsx
,优点是导出的数据不受行数限制,缺点导出速度慢HSSF方式,最多只支持65536
条数据导出,超过这个条数会报错!
public class ExcelWrite2003Test { public static String PATH = "execl/"; public static void main(String[] args) throws Exception { //时间 long begin = System.currentTimeMillis(); //创建一个工作簿 Workbook workbook = new HSSFWorkbook(); //创建表 Sheet sheet = workbook.createSheet(); //写入数据 for (int rowNumber = 0; rowNumber < 65536; rowNumber++) { //创建行 Row row = sheet.createRow(rowNumber); for (int cellNumber = 0; cellNumber < 10; cellNumber++) { //创建列 Cell cell = row.createCell(cellNumber); cell.setCellValue(cellNumber); } } System.out.println("over"); FileOutputStream fileOutputStream = new FileOutputStream(PATH + "用户信息表2003BigData.xls"); workbook.write(fileOutputStream); fileOutputStream.close(); long end = System.currentTimeMillis(); System.out.println((double) (end - begin) / 1000);//4.29s } }
XSSF方式支持大批量数据导出,所有的数据先写入内存再导出,容易出现内存溢出!
public class ExcelWrite2007Test { public static String PATH = "execl/"; public static void main(String[] args) throws Exception { //时间 long begin = System.currentTimeMillis(); //创建一个工作簿 Workbook workbook = new XSSFWorkbook(); //创建表 Sheet sheet = workbook.createSheet(); //写入数据 for (int rowNumber = 0; rowNumber < 65537; rowNumber++) { Row row = sheet.createRow(rowNumber); for (int cellNumber = 0; cellNumber < 10; cellNumber++) { Cell cell = row.createCell(cellNumber); cell.setCellValue(cellNumber); } } System.out.println("over"); FileOutputStream fileOutputStream = new FileOutputStream(PATH + "用户信息表2007BigData.xlsx"); workbook.write(fileOutputStream); fileOutputStream.close(); long end = System.currentTimeMillis(); System.out.println((double) (end - begin) / 1000);//15.87s } }
SXSSF方式是XSSF方式的一种延伸,主要特性是低内存,导出的时候,先将数据写入磁盘再导出,避免报内存不足,导致程序运行异常,缺点是运行很慢!
public class ExcelWriteSXSSFTest { public static String PATH = "execl/"; public static void main(String[] args) throws Exception { //时间 long begin = System.currentTimeMillis(); //创建一个工作簿 Workbook workbook = new SXSSFWorkbook(); //创建表 Sheet sheet = workbook.createSheet(); //写入数据 for (int rowNumber = 0; rowNumber < 100000; rowNumber++) { Row row = sheet.createRow(rowNumber); for (int cellNumber = 0; cellNumber < 10; cellNumber++) { Cell cell = row.createCell(cellNumber); cell.setCellValue(cellNumber); } } System.out.println("over"); FileOutputStream fileOutputStream = new FileOutputStream(PATH + "用户信息表2007BigDataS.xlsx"); workbook.write(fileOutputStream); fileOutputStream.close(); long end = System.currentTimeMillis(); System.out.println((double) (end - begin) / 1000);//6.39s } }
导入操作,即将 excel 中的数据采用java工具库将其解析出来,进而将 excel 数据写入数据库!
同样,在 poi 工具库中,导入 api 也分三种方式,与上面的导出一一对应!
public class ExcelRead2003Test { public static String PATH = "execl/"; public static void main(String[] args) throws Exception { //获取文件流 FileInputStream inputStream = new FileInputStream(PATH + "用户信息表2003BigData.xls"); //1.创建工作簿,使用excel能操作的这边都看看操作 Workbook workbook = new HSSFWorkbook(inputStream); //2.得到表 Sheet sheet = workbook.getSheetAt(0); //3.得到行 Row row = sheet.getRow(0); //4.得到列 Cell cell = row.getCell(0); getValue(cell); inputStream.close(); } public static void getValue(Cell cell) { //匹配类型数据 if (cell != null) { CellType cellType = cell.getCellType(); String cellValue = ""; switch (cellType) { case STRING: //字符串 System.out.print("[String类型]"); cellValue = cell.getStringCellValue(); break; case BOOLEAN: //布尔类型 System.out.print("[boolean类型]"); cellValue = String.valueOf(cell.getBooleanCellValue()); break; case BLANK: //空 System.out.print("[BLANK类型]"); break; case NUMERIC: //数字(日期、普通数字) System.out.print("[NUMERIC类型]"); if (HSSFDateUtil.isCellDateFormatted(cell)) { //日期 System.out.print("[日期]"); Date date = cell.getDateCellValue(); cellValue = new DateTime(date).toString("yyyy-MM-dd"); } else { //不是日期格式,防止数字过长 System.out.print("[转换为字符串输出]"); cell.setCellType(CellType.STRING); cellValue = cell.toString(); } break; case ERROR: System.out.print("[数据类型错误]"); break; } System.out.println(cellValue); } } }
public class ExcelRead2007Test { public static String PATH = "execl/"; public static void main(String[] args) throws Exception { //获取文件流 FileInputStream inputStream = new FileInputStream(PATH + "用户信息表2007BigData.xlsx"); //1.创建工作簿,使用excel能操作的这边都看看操作 Workbook workbook = new XSSFWorkbook(inputStream); //2.得到表 Sheet sheet = workbook.getSheetAt(0); //3.得到行 Row row = sheet.getRow(0); //4.得到列 Cell cell = row.getCell(0); getValue(cell); inputStream.close(); } public static void getValue(Cell cell) { //匹配类型数据 if (cell != null) { CellType cellType = cell.getCellType(); String cellValue = ""; switch (cellType) { case STRING: //字符串 System.out.print("[String类型]"); cellValue = cell.getStringCellValue(); break; case BOOLEAN: //布尔类型 System.out.print("[boolean类型]"); cellValue = String.valueOf(cell.getBooleanCellValue()); break; case BLANK: //空 System.out.print("[BLANK类型]"); break; case NUMERIC: //数字(日期、普通数字) System.out.print("[NUMERIC类型]"); if (HSSFDateUtil.isCellDateFormatted(cell)) { //日期 System.out.print("[日期]"); Date date = cell.getDateCellValue(); cellValue = new DateTime(date).toString("yyyy-MM-dd"); } else { //不是日期格式,防止数字过长 System.out.print("[转换为字符串输出]"); cell.setCellType(CellType.STRING); cellValue = cell.toString(); } break; case ERROR: System.out.print("[数据类型错误]"); break; } System.out.println(cellValue); } } }
public class ExcelReadSXSSFTest { public static String PATH = "execl/"; public static void main(String[] args) throws Exception { //获取文件流 //1.创建工作簿,使用excel能操作的这边都看看操作 OPCPackage opcPackage = OPCPackage.open(PATH + "用户信息表2007BigData.xlsx"); XSSFReader xssfReader = new XSSFReader(opcPackage); StylesTable stylesTable = xssfReader.getStylesTable(); ReadOnlySharedStringsTable sharedStringsTable = new ReadOnlySharedStringsTable(opcPackage); // 创建XMLReader,设置ContentHandler XMLReader xmlReader = SAXHelper.newXMLReader(); xmlReader.setContentHandler(new XSSFSheetXMLHandler(stylesTable, sharedStringsTable, new SimpleSheetContentsHandler(), false)); // 解析每个Sheet数据 Iterator<InputStream> sheetsData = xssfReader.getSheetsData(); while (sheetsData.hasNext()) { try (InputStream inputStream = sheetsData.next();) { xmlReader.parse(new InputSource(inputStream)); } } } /** * 内容处理器 */ public static class SimpleSheetContentsHandler implements XSSFSheetXMLHandler.SheetContentsHandler { protected List<String> row; /** * A row with the (zero based) row number has started * * @param rowNum */ @Override public void startRow(int rowNum) { row = new ArrayList<>(); } /** * A row with the (zero based) row number has ended * * @param rowNum */ @Override public void endRow(int rowNum) { if (row.isEmpty()) { return; } // 处理数据 System.out.println(row.stream().collect(Collectors.joining(" "))); } /** * A cell, with the given formatted value (may be null), * and possibly a comment (may be null), was encountered * * @param cellReference * @param formattedValue * @param comment */ @Override public void cell(String cellReference, String formattedValue, XSSFComment comment) { row.add(formattedValue); } /** * A header or footer has been encountered * * @param text * @param isHeader * @param tagName */ @Override public void headerFooter(String text, boolean isHeader, String tagName) { } } }
标签:try r++ ret read 磁盘 nice tar 限制 arraylist
原文地址:https://www.cnblogs.com/ooo0/p/14591231.html