一、Excel的版本区别(03版和07版)
所谓“03版” 和 “07版”,指的是 Microsoft Excel 版本号。这些版本号代表着不同的Excel 文件格式。2003版 Excel 使用的文件格式为 .xls,而2007版开始使用新的文件格式 .xlsx。
. xlsx 文件格式使用了一种基于 XML 的压缩方式来存储 Excel 数据,这种方式可以减小文件大小,并提高文件的可读性和可编辑性。相比之下,.xls 文件格式是一种二进制格式,常常导致文件体积较大以及许多兼容性问题。
除了文件格式之外,Microsoft Excel 2007和Microsoft Excel 2003之间还存在一些其他差异:
-
兼容性差异。由于文件格式的不同,Microsoft Excel 2003不能直接打开Microsoft Excel 2007的 .xlsx 文件,除非安装了文件格式转换器。
-
新功能差异。Microsoft Excel 2007引入了许多新功能,如数据透视表和高级图表,而这些功能在Microsoft Excel 2003中并不存在。
-
最大行数差异。Microsoft Excel 2007支持最多 1048576 行数据,而Microsoft Excel 2003仅支持最多 65536 行数据。
总的来说,Microsoft Excel 2007相对于2003具有更好的用户体验、更高的数据处理能力、更好的可视化效果、更好的稳定性和兼容性。但是,当需要与使用 Microsoft Excel 2003 的用户共享文件时,则需要注意版本兼容性问题。
二、Apache POI 存在的问题和POI 操作Execl
存在的问题:
Java解析、生成Excel比较有名的框架有POI、JXL。但是它们都存在一个严重的问题,就是非常损耗内存,也就是数据量比较大的时候有可能会出现OOM(内存溢出)的问题,但是POI有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但是依旧没有完全的解决内存消耗过大的问题。
Apache POI操作Execl
03版本
①、写入数据(跟导入导出的逻辑很类似)
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo {
public static void main(String[] args) throws IOException {
new Demo().writedemo();
}
public void writedemo() throws IOException {
//创建工作薄 (03 版本)
HSSFWorkbook workbookb = new HSSFWorkbook();
//创建工作表
HSSFSheet sheet = workbookb.createSheet("sheet1");
//创建行
HSSFRow cells = sheet.createRow(1);
//创建单元格
HSSFCell cell = cells.createCell(1);
//写入数据
cell.setCellValue("商品ID");
//生成一张表(IO流)
FileOutputStream fileOutputStream = new FileOutputStream("./测试数据.xls");
workbookb.write(fileOutputStream);
//关闭输出流
fileOutputStream.close();
System.out.println("文件生成完毕!");
}
}
生成成功!
②、读取数据
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 java.io.FileInputStream;
public class TestDemo {
public static void main(String[] args) throws Exception {
//读文件操作
readexcel030();
}
public static void readexcel030() throws Exception {
//1.通过文件流读取Excel工作簿
FileInputStream inPutStream = new FileInputStream("./03TestBatchData.xls");
//2.获取工作簿
Workbook workbook=new HSSFWorkbook(inPutStream);
//3.获取表(通过下标的方式来进行读取或者 可以采用表名来进行读取)
Sheet sheet = workbook.getSheetAt( 0);
//4.获取行(采用下标的方式来进行获取)
Row row=sheet.getRow( 0);
//5.获取单元格(采用下标的方式)
Cell cell = row.getCell( 0);
//6.读取数据
//String data =cell.getStringCellValue();
Integer data = (int) cell.getNumericCellValue();
System.out.println(data);
//7.关闭流
inPutStream.close();}
}
07版本
①、写入数据
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo {
public static void main(String[] args) throws IOException {
new Demo().writedemo();
}
public void writedemo() throws IOException {
//创建工作薄 (03 版本)
XSSFWorkbook workbookb = new XSSFWorkbook();
//创建工作表
XSSFSheet sheet = workbookb.createSheet("sheet1");
//创建行
XSSFRow cells = sheet.createRow(1);
//创建单元格
XSSFCell cell = cells.createCell(1);
//写入数据
cell.setCellValue("产品ID");
//生成一张表(IO流)
FileOutputStream fileOutputStream = new FileOutputStream("./测试数据.xlsx");
workbookb.write(fileOutputStream);
//关闭输出流
fileOutputStream.close();
System.out.println("文件生成完毕!");
}
}
②、读取数据(与03类似)
三、批量数据和大量数据的写入
03版本
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestDemo {
public static void main(String[] args) throws IOException {
// 03 版本
writeBatchData03();
}
public static void writeBatchData03() throws IOException {
//开始时间
long start = System.currentTimeMillis();
//创建工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
//创建表
HSSFSheet sheet = workbook.createSheet();
//03 版本最多只能写入65536行数据,超出这个行数就会报出异常
for (int rowNum = 0; rowNum < 65536; rowNum++) {
HSSFRow row = sheet.createRow(rowNum);
for (int cellNum = 0; cellNum < 20; cellNum++) {
HSSFCell cell = row.createCell(cellNum);
cell.setCellValue(cellNum+1);
}
}
//生成表
FileOutputStream fileOutputStream = new FileOutputStream("./03TestBatchData.xls");
workbook.write(fileOutputStream);
fileOutputStream.close();
System.out.println("03版本表格生成完毕!");
//结束时间
long end = System.currentTimeMillis();
System.out.println("耗时:"+(end - start)/1000+"秒");
}
}
( 即使没有创建好 03TestBatchData.xls 也会自动生成,当然此处也没有指定生成的sheet页面,默认会在sheet 0 内创建好,如果指定了,则会在指定的sheet页内进行创建。(如果没有新建一个对象,仅在原有的对象的workbook.createSheet 语句上进行修改,那么原来Excel文件创建好的sheet的内容则会被覆盖))
HSSFSheet sheet = workbook.createSheet("03");
07版本(这个时间明显要比03版本的慢很多)
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestDemo {
public static void main(String[] args) throws IOException {
// 07 版本
writeBatchData07();
}
public static void writeBatchData07() throws IOException {
//开始时间
long start = System.currentTimeMillis();
//创建工作簿
XSSFWorkbook workbook = new XSSFWorkbook();
//创建表
XSSFSheet sheet = workbook.createSheet("03");
//03 版本最多只能写入65536行数据,超出这个行数就会报出异常
for (int rowNum = 0; rowNum < 65536; rowNum++) {
XSSFRow row = sheet.createRow(rowNum);
for (int cellNum = 0; cellNum < 20; cellNum++) {
XSSFCell cell = row.createCell(cellNum);
cell.setCellValue(cellNum+1);
}
}
//生成表
FileOutputStream fileOutputStream = new FileOutputStream("./07TestBatchData.xlsx");
workbook.write(fileOutputStream);
fileOutputStream.close();
System.out.println("07版本表格生成完毕!");
//结束时间
long end = System.currentTimeMillis();
System.out.println("耗时:"+(end - start)/1000+"秒");
}
}
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestDemo {
public static void main(String[] args) throws IOException {
// 07 版本大表模式
writeBigData07();
}
public static void writeBigData07() throws IOException {
//开始时间
long start = System.currentTimeMillis();
//创建工作簿(可以自定义窗口大小,不填就是使用默认值100的窗口)
SXSSFWorkbook workbook = new SXSSFWorkbook();
//创建表
SXSSFSheet sheet = workbook.createSheet("07");
//03 版本最多只能写入65536行数据,超出这个行数就会报出异常
for (int rowNum = 0; rowNum < 65536; rowNum++) {
SXSSFRow row = sheet.createRow(rowNum);
for (int cellNum = 0; cellNum < 20; cellNum++) {
SXSSFCell cell = row.createCell(cellNum);
cell.setCellValue(cellNum+1);
}
}
//生成表
FileOutputStream fileOutputStream = new FileOutputStream("./07TestBigData.xlsx");
workbook.write(fileOutputStream);
fileOutputStream.close();
System.out.println("07版本大表格生成完毕!");
//结束时间
long end = System.currentTimeMillis();
System.out.println("耗时:"+(end - start)/1000+"秒");
}
}
可以看到时间快了非常多(相比之前的07版本来说)
四、注意事项
程序进行操作的时候记得一定要把excel文件关闭。