fix code for poi

This commit is contained in:
Looly 2020-09-30 01:16:04 +08:00
parent 60efd24469
commit 4c278dcccb
3 changed files with 93 additions and 34 deletions

View File

@ -2,7 +2,6 @@ package cn.hutool.poi.excel;
import cn.hutool.core.exceptions.DependencyException;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.StrUtil;
@ -10,6 +9,8 @@ import cn.hutool.poi.PoiChecker;
import cn.hutool.poi.excel.cell.CellLocation;
import cn.hutool.poi.excel.sax.Excel03SaxReader;
import cn.hutool.poi.excel.sax.Excel07SaxReader;
import cn.hutool.poi.excel.sax.ExcelSaxReader;
import cn.hutool.poi.excel.sax.ExcelSaxUtil;
import cn.hutool.poi.excel.sax.handler.RowHandler;
import java.io.File;
@ -28,59 +29,92 @@ public class ExcelUtil {
* 通过Sax方式读取Excel同时支持03和07格式
*
* @param path Excel文件路径
* @param sheetIndex sheet序号
* @param rid sheet rid-1表示全部Sheet, 0表示第一个Sheet
* @param rowHandler 行处理器
* @since 3.2.0
*/
public static void readBySax(String path, int sheetIndex, RowHandler rowHandler) {
readBySax(FileUtil.file(path), sheetIndex, rowHandler);
public static void readBySax(String path, int rid, RowHandler rowHandler) {
readBySax(FileUtil.file(path), rid, rowHandler);
}
/**
* 通过Sax方式读取Excel同时支持03和07格式
*
* @param path Excel文件路径
* @param idOrRid Excel中的sheet id或者rid编号rid必须加rId前缀例如rId1如果为-1处理所有编号的sheet
* @param rowHandler 行处理器
* @since 5.4.4
*/
public static void readBySax(String path, String idOrRid, RowHandler rowHandler) {
readBySax(FileUtil.file(path), idOrRid, rowHandler);
}
/**
* 通过Sax方式读取Excel同时支持03和07格式
*
* @param file Excel文件
* @param sheetIndex sheet序号
* @param rid sheet rid-1表示全部Sheet, 0表示第一个Sheet
* @param rowHandler 行处理器
* @since 3.2.0
*/
public static void readBySax(File file, int sheetIndex, RowHandler rowHandler) {
if (ExcelFileUtil.isXlsx(file)) {
read07BySax(file, sheetIndex, rowHandler);
} else {
read03BySax(file, sheetIndex, rowHandler);
public static void readBySax(File file, int rid, RowHandler rowHandler) {
final ExcelSaxReader<?> reader = ExcelSaxUtil.createSaxReader(ExcelFileUtil.isXlsx(file), rowHandler);
reader.read(file, rid);
}
/**
* 通过Sax方式读取Excel同时支持03和07格式
*
* @param file Excel文件
* @param idOrRid Excel中的sheet id或者rid编号rid必须加rId前缀例如rId1如果为-1处理所有编号的sheet
* @param rowHandler 行处理器
* @since 5.4.4
*/
public static void readBySax(File file, String idOrRid, RowHandler rowHandler) {
final ExcelSaxReader<?> reader = ExcelSaxUtil.createSaxReader(ExcelFileUtil.isXlsx(file), rowHandler);
reader.read(file, idOrRid);
}
/**
* 通过Sax方式读取Excel同时支持03和07格式
*
* @param in Excel流
* @param sheetIndex sheet序号
* @param rid sheet rid-1表示全部Sheet, 0表示第一个Sheet
* @param rowHandler 行处理器
* @since 3.2.0
*/
public static void readBySax(InputStream in, int sheetIndex, RowHandler rowHandler) {
in = IoUtil.toMarkSupportStream(in);
if (ExcelFileUtil.isXlsx(in)) {
read07BySax(in, sheetIndex, rowHandler);
} else {
read03BySax(in, sheetIndex, rowHandler);
public static void readBySax(InputStream in, int rid, RowHandler rowHandler) {
final ExcelSaxReader<?> reader = ExcelSaxUtil.createSaxReader(ExcelFileUtil.isXlsx(in), rowHandler);
reader.read(in, rid);
}
/**
* 通过Sax方式读取Excel同时支持03和07格式
*
* @param in Excel流
* @param idOrRid Excel中的sheet id或者rid编号rid必须加rId前缀例如rId1如果为-1处理所有编号的sheet
* @param rowHandler 行处理器
* @since 5.4.4
*/
public static void readBySax(InputStream in, String idOrRid, RowHandler rowHandler) {
final ExcelSaxReader<?> reader = ExcelSaxUtil.createSaxReader(ExcelFileUtil.isXlsx(in), rowHandler);
reader.read(in, idOrRid);
}
/**
* Sax方式读取Excel07
*
* @param in 输入流
* @param sheetIndex Sheet索引-1表示全部Sheet, 0表示第一个Sheet
* @param rid Sheet rid-1表示全部Sheet, 0表示第一个Sheet
* @param rowHandler 行处理器
* @return {@link Excel07SaxReader}
* @since 3.2.0
* @deprecated 请使用 {@link #readBySax(InputStream, int, RowHandler)}
*/
public static Excel07SaxReader read07BySax(InputStream in, int sheetIndex, RowHandler rowHandler) {
@Deprecated
public static Excel07SaxReader read07BySax(InputStream in, int rid, RowHandler rowHandler) {
try {
return new Excel07SaxReader(rowHandler).read(in, sheetIndex);
return new Excel07SaxReader(rowHandler).read(in, rid);
} catch (NoClassDefFoundError e) {
throw new DependencyException(ObjectUtil.defaultIfNull(e.getCause(), e), PoiChecker.NO_POI_ERROR_MSG);
}
@ -90,14 +124,16 @@ public class ExcelUtil {
* Sax方式读取Excel07
*
* @param file 文件
* @param sheetIndex Sheet索引-1表示全部Sheet, 0表示第一个Sheet
* @param rid Sheet rid-1表示全部Sheet, 0表示第一个Sheet
* @param rowHandler 行处理器
* @return {@link Excel07SaxReader}
* @since 3.2.0
* @deprecated 请使用 {@link #readBySax(File, int, RowHandler)}
*/
public static Excel07SaxReader read07BySax(File file, int sheetIndex, RowHandler rowHandler) {
@Deprecated
public static Excel07SaxReader read07BySax(File file, int rid, RowHandler rowHandler) {
try {
return new Excel07SaxReader(rowHandler).read(file, sheetIndex);
return new Excel07SaxReader(rowHandler).read(file, rid);
} catch (NoClassDefFoundError e) {
throw new DependencyException(ObjectUtil.defaultIfNull(e.getCause(), e), PoiChecker.NO_POI_ERROR_MSG);
}
@ -107,14 +143,16 @@ public class ExcelUtil {
* Sax方式读取Excel07
*
* @param path 路径
* @param sheetIndex Sheet索引-1表示全部Sheet, 0表示第一个Sheet
* @param rid Sheet rid-1表示全部Sheet, 0表示第一个Sheet
* @param rowHandler 行处理器
* @return {@link Excel07SaxReader}
* @since 3.2.0
* @deprecated 请使用 {@link #readBySax(String, int, RowHandler)}
*/
public static Excel07SaxReader read07BySax(String path, int sheetIndex, RowHandler rowHandler) {
@Deprecated
public static Excel07SaxReader read07BySax(String path, int rid, RowHandler rowHandler) {
try {
return new Excel07SaxReader(rowHandler).read(path, sheetIndex);
return new Excel07SaxReader(rowHandler).read(path, rid);
} catch (NoClassDefFoundError e) {
throw new DependencyException(ObjectUtil.defaultIfNull(e.getCause(), e), PoiChecker.NO_POI_ERROR_MSG);
}
@ -126,9 +164,11 @@ public class ExcelUtil {
* @param in 输入流
* @param sheetIndex Sheet索引-1表示全部Sheet, 0表示第一个Sheet
* @param rowHandler 行处理器
* @return {@link Excel07SaxReader}
* @return {@link Excel03SaxReader}
* @since 3.2.0
* @deprecated 请使用 {@link #readBySax(InputStream, int, RowHandler)}
*/
@Deprecated
public static Excel03SaxReader read03BySax(InputStream in, int sheetIndex, RowHandler rowHandler) {
try {
return new Excel03SaxReader(rowHandler).read(in, sheetIndex);
@ -145,7 +185,9 @@ public class ExcelUtil {
* @param rowHandler 行处理器
* @return {@link Excel03SaxReader}
* @since 3.2.0
* @deprecated 请使用 {@link #readBySax(File, int, RowHandler)}
*/
@Deprecated
public static Excel03SaxReader read03BySax(File file, int sheetIndex, RowHandler rowHandler) {
try {
return new Excel03SaxReader(rowHandler).read(file, sheetIndex);
@ -162,7 +204,9 @@ public class ExcelUtil {
* @param rowHandler 行处理器
* @return {@link Excel03SaxReader}
* @since 3.2.0
* @deprecated 请使用 {@link #readBySax(String, int, RowHandler)}
*/
@Deprecated
public static Excel03SaxReader read03BySax(String path, int sheetIndex, RowHandler rowHandler) {
try {
return new Excel03SaxReader(rowHandler).read(path, sheetIndex);

View File

@ -5,6 +5,7 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.exceptions.DependencyException;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.util.StrUtil;
import cn.hutool.poi.excel.sax.handler.RowHandler;
import cn.hutool.poi.exceptions.POIException;
import org.apache.poi.ooxml.util.SAXHelper;
import org.apache.poi.ss.usermodel.DataFormatter;
@ -192,6 +193,20 @@ public class ExcelSaxUtil {
return DateUtil.date(org.apache.poi.ss.usermodel.DateUtil.getJavaDate(value, false));
}
/**
* 创建 {@link ExcelSaxReader}
*
* @param isXlsx 是否为xlsx格式07格式
* @param rowHandler 行处理器
* @return {@link ExcelSaxReader}
* @since 5.4.4
*/
public static ExcelSaxReader<?> createSaxReader(boolean isXlsx, RowHandler rowHandler) {
return isXlsx
? new Excel07SaxReader(rowHandler)
: new Excel03SaxReader(rowHandler);
}
/**
* 获取数字类型值
*

View File

@ -25,7 +25,7 @@ public class ExcelSaxReadTest {
@Test
public void excel07Test() {
// 工具化快速读取
ExcelUtil.read07BySax("aaa.xlsx", 0, createRowHandler());
ExcelUtil.readBySax("aaa.xlsx", 0, createRowHandler());
}
@Test
@ -33,7 +33,7 @@ public class ExcelSaxReadTest {
Excel03SaxReader reader = new Excel03SaxReader(createRowHandler());
reader.read("aaa.xls", 1);
// Console.log("Sheet index: [{}], Sheet name: [{}]", reader.getSheetIndex(), reader.getSheetName());
ExcelUtil.read03BySax("aaa.xls", 1, createRowHandler());
ExcelUtil.readBySax("aaa.xls", 1, createRowHandler());
}
@Test
@ -105,14 +105,14 @@ public class ExcelSaxReadTest {
@Test
@Ignore
public void dateReadTest(){
public void dateReadTest() {
ExcelUtil.readBySax("d:/test/sax_date_test.xlsx", 0, (i, i1, list) ->
Console.log(StrUtil.join(", ", list)));
}
@Test
@Ignore
public void readBlankTest(){
public void readBlankTest() {
File file = new File("D:/test/b.xlsx");
ExcelUtil.readBySax(file, 0, (sheetIndex, rowIndex, rowList) -> rowList.forEach(Console::log));