1、POI工具介紹
1.1、POI 是用Java編寫的免費(fèi)開源的跨平臺的 Java API,Apache POI提供API給Java程式對Microsoft Office格式檔案讀和寫的功能。
1.2、主要是運(yùn)用其中讀取和輸出excel的功能。
1.3、POI官網(wǎng)地址:
https://poi.apache.org/components/index.html
2、POI可操作的文件類型
3、POI所需依賴
<!--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>
4、xls和xlsx的區(qū)別
xls是excel03版本 xlsx是excel07版本
最大的區(qū)別是行列數(shù)不同
xls最大支持65536行、256列
xlsx最大支持1048576行、16384列
poi操作
poi 操作xls
poi-ooml操作xlsx
5、POI Excel 寫 03(xls)和07(xlsx)版本方式
package poi;
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;
import org.junit.Test;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author yw
* @since 2022/11/20
*/
public class ExcelWrite {
public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
String PATH = "D:\\excel\\";
/**
* 寫工作簿 03版本
*/
@Test
public void Write03() throws Exception {
//1.創(chuàng)建一個(gè)工作簿
Workbook workbook = new HSSFWorkbook();
//2.創(chuàng)建 一個(gè)工作表
Sheet sheet = workbook.createSheet("工人表");
//3.創(chuàng)建一行
Row row1 = sheet.createRow(0);
//4.創(chuàng)建一個(gè)單元格
//(1,1)
Cell cell1 = row1.createCell(0);
cell1.setCellValue("工號");
//(1,2)
Cell cell2 = row1.createCell(1);
cell2.setCellValue("日期");
//創(chuàng)建第二行
Row row2 = sheet.createRow(1);
//(2,1)
Cell cell21 = row2.createCell(0);
cell21.setCellValue(001);
//(2,2)
Cell cell22 = row2.createCell(1);
SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_DATE_FORMAT);
String datetime = sdf.format(new Date());
cell22.setCellValue(datetime);
//生成一張表(IO流),03版本就是使用xls結(jié)尾
FileOutputStream fos = new FileOutputStream(PATH + "工人表03.xls");
//輸出
workbook.write(fos);
//關(guān)閉流
fos.close();
System.out.println("文件生成完畢");
}
/**
* 寫工作簿 07版本
*/
@Test
public void Write07() throws Exception {
//1.創(chuàng)建一個(gè)工作簿
Workbook workbook = new XSSFWorkbook();
//2.創(chuàng)建 一個(gè)工作表
Sheet sheet = workbook.createSheet("工人表");
//3.創(chuàng)建一行
Row row1 = sheet.createRow(0);
//4.創(chuàng)建一個(gè)單元格
//(1,1)
Cell cell1 = row1.createCell(0);
cell1.setCellValue("工號");
//(1,2)
Cell cell2 = row1.createCell(1);
cell2.setCellValue("日期");
//創(chuàng)建第二行
Row row2 = sheet.createRow(1);
//(2,1)
Cell cell21 = row2.createCell(0);
cell21.setCellValue(001);
//(2,2)
Cell cell22 = row2.createCell(1);
SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_DATE_FORMAT);
String datetime = sdf.format(new Date());
cell22.setCellValue(datetime);
//生成一張表(IO流),03版本就是使用xlsx結(jié)尾
FileOutputStream fos = new FileOutputStream(PATH + "工人表07.xlsx");
//輸出
workbook.write(fos);
//關(guān)閉流
fos.close();
System.out.println("文件生成完畢");
}
}
6、HSSF和XSSF寫大文件的區(qū)別
6.1、使用HSSF寫大文件
@Test
public void Write03BigData() throws Exception{
//時(shí)間
long begin = System.currentTimeMillis();
//1.創(chuàng)建一個(gè)工作簿
Workbook workbook = new HSSFWorkbook();
//2.創(chuàng)建一個(gè)表
Sheet sheet = workbook.createSheet("sheet1");
//寫入數(shù)據(jù)
for (int rowNum = 0;rowNum<65536;rowNum++){
//3.創(chuàng)建行
Row row = sheet.createRow(rowNum);
for (int CellNum = 0;CellNum<10;CellNum++){
Cell cell = row.createCell(CellNum);
cell.setCellValue(CellNum);
}
}
System.out.println("over");
//獲取io流
FileOutputStream fos = new FileOutputStream(PATH+"Write03BigData.xlsx");
//生成一張表
workbook.write(fos);
fos.close();
long end = System.currentTimeMillis();
System.out.println("耗時(shí):"+(end-begin));
}
優(yōu)點(diǎn):過程中寫入緩存,不操作磁盤,最后再一次性導(dǎo)入磁盤,速度快+
缺點(diǎn):但是只能寫入65535條數(shù)據(jù),超過就會報(bào)異常
6.2、使用XSSF寫大文件
@Test
public void Write07BigData() throws Exception{
//時(shí)間
long begin = System.currentTimeMillis();
//1.創(chuàng)建一個(gè)工作簿
Workbook workbook = new XSSFWorkbook();
//2.創(chuàng)建一個(gè)表
Sheet sheet = workbook.createSheet("sheet1");
//寫入數(shù)據(jù)
for (int rowNum = 0;rowNum<1000000;rowNum++){
//3.創(chuàng)建行
Row row = sheet.createRow(rowNum);
for (int CellNum = 0;CellNum<10;CellNum++){
Cell cell = row.createCell(CellNum);
cell.setCellValue(CellNum);
}
}
System.out.println("over");
//獲取io流
FileOutputStream fos = new FileOutputStream(PATH+"Write07BigData.xlsx");
//生成一張表
workbook.write(fos);
fos.close();
long end = System.currentTimeMillis();
System.out.println("耗時(shí):"+(end-begin));
}
優(yōu)點(diǎn):可以寫較大數(shù)據(jù)量(超過655135條),如10萬條
缺點(diǎn):寫數(shù)據(jù)時(shí),速度非常慢,非常消耗內(nèi)存,也會容易發(fā)生內(nèi)存溢出,如100萬條的時(shí)候。
6.3、使用SXSS寫大文件
@Test
public void Write07BigDataS() throws Exception{
//時(shí)間
long begin = System.currentTimeMillis();
//1.創(chuàng)建一個(gè)工作簿
Workbook workbook = new SXSSFWorkbook(200);
//2.創(chuàng)建一個(gè)表
Sheet sheet = workbook.createSheet("sheet1");
//寫入數(shù)據(jù)
for (int rowNum = 0;rowNum<1000000;rowNum++){
//3.創(chuàng)建行
Row row = sheet.createRow(rowNum);
for (int CellNum = 0;CellNum<10;CellNum++){
Cell cell = row.createCell(CellNum);
cell.setCellValue(CellNum);
}
}
System.out.println("over");
//獲取io流
FileOutputStream fos = new FileOutputStream(PATH+"Write07BigDataS.xlsx");
//生成一張表
workbook.write(fos);
fos.close();
//清除臨時(shí)文件
((SXSSFWorkbook) workbook).dispose();
long end = System.currentTimeMillis();
System.out.println("耗時(shí):"+(end-begin));
}
優(yōu)點(diǎn):可以寫超大數(shù)據(jù)量的,比如100萬條,寫數(shù)據(jù)速度更快,占用更少內(nèi)存
注意:
1、過程中會產(chǎn)生臨時(shí)文件,結(jié)束時(shí)需要注意清理
2、默認(rèn)100條記錄會保存在內(nèi)存中,如果超過這個(gè)數(shù)據(jù),則最前面的數(shù)據(jù)會被寫入磁盤中
3、如果想自定義內(nèi)存中的數(shù)量,則可以new SXSSFWorkbook(自定義數(shù)量)文章來源:http://www.zghlxwxcb.cn/news/detail-628772.html
SXSSFWorkbook-來至官方的解釋︰實(shí)現(xiàn)"BigGridDemo"策略的流式XSSFWorkbook版本。這允許寫入非常大的文件而不會耗盡內(nèi)存,因?yàn)槿魏螘r(shí)候只有可配置的行部分被保存在內(nèi)存中。文章來源地址http://www.zghlxwxcb.cn/news/detail-628772.html
到了這里,關(guān)于使用POI實(shí)現(xiàn)JAVA操作Excel文件的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!