Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Laubin729
easyexcel
提交
1e5f9dcb
E
easyexcel
项目概览
Laubin729
/
easyexcel
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
E
easyexcel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
1e5f9dcb
编写于
8月 19, 2019
作者:
Z
zhuangjiaju
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
优化读写逻辑
上级
cbdba9a0
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
130 addition
and
26 deletion
+130
-26
src/main/java/com/alibaba/excel/analysis/ExcelAnalyserImpl.java
...in/java/com/alibaba/excel/analysis/ExcelAnalyserImpl.java
+31
-4
src/main/java/com/alibaba/excel/analysis/v03/XlsSaxAnalyser.java
...n/java/com/alibaba/excel/analysis/v03/XlsSaxAnalyser.java
+4
-14
src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java
.../java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java
+15
-6
src/test/java/com/alibaba/easyexcel/test/temp/LockTest.java
src/test/java/com/alibaba/easyexcel/test/temp/LockTest.java
+38
-0
src/test/java/com/alibaba/easyexcel/test/temp/StyleTest.java
src/test/java/com/alibaba/easyexcel/test/temp/StyleTest.java
+42
-2
未找到文件。
src/main/java/com/alibaba/excel/analysis/ExcelAnalyserImpl.java
浏览文件 @
1e5f9dcb
package
com.alibaba.excel.analysis
;
import
java.io.InputStream
;
import
org.apache.poi.poifs.crypt.Decryptor
;
import
org.apache.poi.poifs.filesystem.DocumentFactoryHelper
;
import
org.apache.poi.poifs.filesystem.POIFSFileSystem
;
import
org.apache.poi.util.IOUtils
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
...
...
@@ -39,17 +45,38 @@ public class ExcelAnalyserImpl implements ExcelAnalyser {
}
private
void
choiceExcelExecutor
()
throws
Exception
{
ExcelTypeEnum
excelType
=
analysisContext
.
readWorkbookHolder
().
getExcelType
();
ReadWorkbookHolder
readWorkbookHolder
=
analysisContext
.
readWorkbookHolder
();
ExcelTypeEnum
excelType
=
readWorkbookHolder
.
getExcelType
();
if
(
excelType
==
null
)
{
excelExecutor
=
new
XlsxSaxAnalyser
(
analysisContext
);
excelExecutor
=
new
XlsxSaxAnalyser
(
analysisContext
,
null
);
return
;
}
switch
(
excelType
)
{
case
XLS:
excelExecutor
=
new
XlsSaxAnalyser
(
analysisContext
);
POIFSFileSystem
poifsFileSystem
=
null
;
if
(
readWorkbookHolder
.
getFile
()
!=
null
)
{
poifsFileSystem
=
new
POIFSFileSystem
(
readWorkbookHolder
.
getFile
());
}
else
{
poifsFileSystem
=
new
POIFSFileSystem
(
readWorkbookHolder
.
getInputStream
());
}
// So in encrypted excel, it looks like XLS but it's actually XLSX
if
(
poifsFileSystem
.
getRoot
().
hasEntry
(
Decryptor
.
DEFAULT_POIFS_ENTRY
))
{
InputStream
decryptedStream
=
null
;
try
{
decryptedStream
=
DocumentFactoryHelper
.
getDecryptedStream
(
poifsFileSystem
.
getRoot
(),
null
);
excelExecutor
=
new
XlsxSaxAnalyser
(
analysisContext
,
decryptedStream
);
return
;
}
finally
{
IOUtils
.
closeQuietly
(
decryptedStream
);
// as we processed the full stream already, we can close the filesystem here
// otherwise file handles are leaked
poifsFileSystem
.
close
();
}
}
excelExecutor
=
new
XlsSaxAnalyser
(
analysisContext
,
poifsFileSystem
);
break
;
case
XLSX:
excelExecutor
=
new
XlsxSaxAnalyser
(
analysisContext
);
excelExecutor
=
new
XlsxSaxAnalyser
(
analysisContext
,
null
);
break
;
default
:
}
...
...
src/main/java/com/alibaba/excel/analysis/v03/XlsSaxAnalyser.java
浏览文件 @
1e5f9dcb
...
...
@@ -14,10 +14,7 @@ import org.apache.poi.hssf.eventusermodel.HSSFListener;
import
org.apache.poi.hssf.eventusermodel.HSSFRequest
;
import
org.apache.poi.hssf.eventusermodel.MissingRecordAwareHSSFListener
;
import
org.apache.poi.hssf.eventusermodel.dummyrecord.LastCellOfRowDummyRecord
;
import
org.apache.poi.hssf.record.ExtendedFormatRecord
;
import
org.apache.poi.hssf.record.Record
;
import
org.apache.poi.hssf.record.StyleRecord
;
import
org.apache.poi.hssf.usermodel.HSSFCellStyle
;
import
org.apache.poi.hssf.usermodel.HSSFWorkbook
;
import
org.apache.poi.poifs.filesystem.POIFSFileSystem
;
...
...
@@ -38,7 +35,6 @@ import com.alibaba.excel.metadata.CellData;
import
com.alibaba.excel.read.listener.event.EachRowAnalysisFinishEvent
;
import
com.alibaba.excel.read.metadata.ReadSheet
;
import
com.alibaba.excel.read.metadata.holder.ReadRowHolder
;
import
com.alibaba.excel.read.metadata.holder.ReadWorkbookHolder
;
import
com.alibaba.excel.util.CollectionUtils
;
/**
...
...
@@ -58,7 +54,7 @@ import com.alibaba.excel.util.CollectionUtils;
*/
public
class
XlsSaxAnalyser
implements
HSSFListener
,
ExcelExecutor
{
private
boolean
outputFormulaValues
=
true
;
private
POIFSFileSystem
fs
;
private
POIFSFileSystem
poifsFileSystem
;
private
int
lastRowNumber
;
private
int
lastColumnNumber
;
private
boolean
notAllEmpty
=
false
;
...
...
@@ -73,16 +69,10 @@ public class XlsSaxAnalyser implements HSSFListener, ExcelExecutor {
private
List
<
XlsRecordHandler
>
recordHandlers
=
new
ArrayList
<
XlsRecordHandler
>();
private
AnalysisContext
analysisContext
;
public
XlsSaxAnalyser
(
AnalysisContext
context
)
throws
IOException
{
public
XlsSaxAnalyser
(
AnalysisContext
context
,
POIFSFileSystem
poifsFileSystem
)
throws
IOException
{
this
.
analysisContext
=
context
;
this
.
records
=
new
TreeMap
<
Integer
,
CellData
>();
ReadWorkbookHolder
readWorkbookHolder
=
analysisContext
.
readWorkbookHolder
();
if
(
readWorkbookHolder
.
getFile
()
!=
null
)
{
this
.
fs
=
new
POIFSFileSystem
(
readWorkbookHolder
.
getFile
());
}
else
{
this
.
fs
=
new
POIFSFileSystem
(
readWorkbookHolder
.
getInputStream
());
}
this
.
poifsFileSystem
=
poifsFileSystem
;
}
@Override
...
...
@@ -110,7 +100,7 @@ public class XlsSaxAnalyser implements HSSFListener, ExcelExecutor {
}
try
{
factory
.
processWorkbookEvents
(
request
,
fs
);
factory
.
processWorkbookEvents
(
request
,
poifsFileSystem
);
}
catch
(
IOException
e
)
{
throw
new
ExcelAnalysisException
(
e
);
}
...
...
src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java
浏览文件 @
1e5f9dcb
...
...
@@ -53,12 +53,12 @@ public class XlsxSaxAnalyser implements ExcelExecutor {
*/
private
StylesTable
stylesTable
;
public
XlsxSaxAnalyser
(
AnalysisContext
analysisContext
)
throws
Exception
{
public
XlsxSaxAnalyser
(
AnalysisContext
analysisContext
,
InputStream
decryptedStream
)
throws
Exception
{
this
.
analysisContext
=
analysisContext
;
// Initialize cache
ReadWorkbookHolder
readWorkbookHolder
=
analysisContext
.
readWorkbookHolder
();
OPCPackage
pkg
=
readOpcPackage
(
readWorkbookHolder
);
OPCPackage
pkg
=
readOpcPackage
(
readWorkbookHolder
,
decryptedStream
);
PackagePart
sharedStringsTablePackagePart
=
pkg
.
getPartsByContentType
(
XSSFRelation
.
SHARED_STRINGS
.
getContentType
()).
get
(
0
);
...
...
@@ -134,17 +134,26 @@ public class XlsxSaxAnalyser implements ExcelExecutor {
readWorkbookHolder
.
getReadCache
().
putFinished
();
}
private
OPCPackage
readOpcPackage
(
ReadWorkbookHolder
readWorkbookHolder
)
throws
Exception
{
if
(
readWorkbookHolder
.
getFile
()
!=
null
)
{
private
OPCPackage
readOpcPackage
(
ReadWorkbookHolder
readWorkbookHolder
,
InputStream
decryptedStream
)
throws
Exception
{
if
(
decryptedStream
==
null
&&
readWorkbookHolder
.
getFile
()
!=
null
)
{
return
OPCPackage
.
open
(
readWorkbookHolder
.
getFile
());
}
if
(
readWorkbookHolder
.
getMandatoryUseInputStream
())
{
return
OPCPackage
.
open
(
readWorkbookHolder
.
getInputStream
());
if
(
decryptedStream
!=
null
)
{
return
OPCPackage
.
open
(
decryptedStream
);
}
else
{
return
OPCPackage
.
open
(
readWorkbookHolder
.
getInputStream
());
}
}
File
readTempFile
=
FileUtils
.
createCacheTmpFile
();
readWorkbookHolder
.
setTempFile
(
readTempFile
);
File
tempFile
=
new
File
(
readTempFile
.
getPath
(),
UUID
.
randomUUID
().
toString
()
+
".xlsx"
);
FileUtils
.
writeToFile
(
tempFile
,
readWorkbookHolder
.
getInputStream
());
if
(
decryptedStream
!=
null
)
{
FileUtils
.
writeToFile
(
tempFile
,
decryptedStream
);
}
else
{
FileUtils
.
writeToFile
(
tempFile
,
readWorkbookHolder
.
getInputStream
());
}
return
OPCPackage
.
open
(
tempFile
);
}
...
...
src/test/java/com/alibaba/easyexcel/test/temp/LockTest.java
0 → 100644
浏览文件 @
1e5f9dcb
package
com.alibaba.easyexcel.test.temp
;
import
java.io.File
;
import
java.io.FileInputStream
;
import
java.util.List
;
import
org.junit.Ignore
;
import
org.junit.Test
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
com.alibaba.excel.EasyExcel
;
import
com.alibaba.fastjson.JSON
;
/**
* 临时测试
*
* @author Jiaju Zhuang
**/
@Ignore
public
class
LockTest
{
private
static
final
Logger
LOGGER
=
LoggerFactory
.
getLogger
(
LockTest
.
class
);
@Test
public
void
test
()
throws
Exception
{
List
<
Object
>
list
=
EasyExcel
.
read
(
new
FileInputStream
(
"D:\\test\\t222.xlsx"
)).
sheet
().
headRowNumber
(
0
).
doReadSync
();
for
(
Object
data
:
list
)
{
LOGGER
.
info
(
"返回数据:{}"
,
JSON
.
toJSONString
(
data
));
}
list
=
EasyExcel
.
read
(
new
File
(
"D:\\test\\t222.xlsx"
)).
sheet
().
headRowNumber
(
0
).
doReadSync
();
for
(
Object
data
:
list
)
{
LOGGER
.
info
(
"返回数据:{}"
,
JSON
.
toJSONString
(
data
));
}
}
}
src/test/java/com/alibaba/easyexcel/test/temp/StyleTest.java
浏览文件 @
1e5f9dcb
package
com.alibaba.easyexcel.test.temp
;
import
java.io.File
;
import
java.io.FileInputStream
;
import
java.io.InputStream
;
import
java.lang.reflect.Field
;
...
...
@@ -10,6 +11,8 @@ import org.apache.poi.hssf.usermodel.HSSFDateUtil;
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.poifs.crypt.Decryptor
;
import
org.apache.poi.poifs.filesystem.POIFSFileSystem
;
import
org.apache.poi.ss.usermodel.BuiltinFormats
;
import
org.apache.poi.ss.usermodel.Cell
;
import
org.apache.poi.ss.usermodel.DataFormatter
;
...
...
@@ -19,7 +22,6 @@ 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.ss.usermodel.WorkbookFactory
;
import
org.apache.tomcat.util.http.fileupload.IOUtils
;
import
org.junit.Ignore
;
import
org.junit.Test
;
import
org.slf4j.Logger
;
...
...
@@ -91,7 +93,7 @@ public class StyleTest {
@Test
public
void
poi0701
()
throws
Exception
{
InputStream
is
=
new
FileInputStream
(
"D:\\test\\f1.xlsx"
);
Workbook
workbook
=
WorkbookFactory
.
create
(
is
);
// 这种方式 Excel 2003/2007/2010 都是可以处理的
Workbook
workbook
=
WorkbookFactory
.
create
(
is
);
Sheet
sheet
=
workbook
.
getSheetAt
(
0
);
print
(
sheet
.
getRow
(
0
).
getCell
(
0
));
print
(
sheet
.
getRow
(
1
).
getCell
(
0
));
...
...
@@ -99,6 +101,44 @@ public class StyleTest {
print
(
sheet
.
getRow
(
3
).
getCell
(
0
));
}
@Test
public
void
poi0702
()
throws
Exception
{
Workbook
workbook
=
WorkbookFactory
.
create
(
new
FileInputStream
(
"D:\\test\\t2.xlsx"
));
workbook
=
WorkbookFactory
.
create
(
new
File
(
"D:\\test\\t2.xlsx"
));
Sheet
sheet
=
workbook
.
getSheetAt
(
0
);
Row
row
=
sheet
.
getRow
(
0
);
System
.
out
.
println
(
row
.
getCell
(
0
).
getNumericCellValue
());
}
@Test
public
void
poi0703
()
throws
Exception
{
try
{
POIFSFileSystem
poifsFileSystem
=
new
POIFSFileSystem
(
new
FileInputStream
(
"D:\\test\\t2.xlsx"
));
System
.
out
.
println
(
poifsFileSystem
.
getRoot
().
hasEntry
(
Decryptor
.
DEFAULT_POIFS_ENTRY
));
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
try
{
POIFSFileSystem
poifsFileSystem
=
new
POIFSFileSystem
(
new
File
(
"D:\\test\\t2.xlsx"
));
System
.
out
.
println
(
poifsFileSystem
.
getRoot
().
hasEntry
(
Decryptor
.
DEFAULT_POIFS_ENTRY
));
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
try
{
POIFSFileSystem
poifsFileSystem
=
new
POIFSFileSystem
(
new
FileInputStream
(
"D:\\test\\t222.xlsx"
));
System
.
out
.
println
(
poifsFileSystem
.
getRoot
().
hasEntry
(
Decryptor
.
DEFAULT_POIFS_ENTRY
));
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
try
{
POIFSFileSystem
poifsFileSystem
=
new
POIFSFileSystem
(
new
File
(
"D:\\test\\t222.xlsx"
));
System
.
out
.
println
(
poifsFileSystem
.
getRoot
().
hasEntry
(
Decryptor
.
DEFAULT_POIFS_ENTRY
));
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
private
void
print
(
Cell
cell
)
{
System
.
out
.
println
(
DateUtil
.
isADateFormat
(
cell
.
getCellStyle
().
getDataFormat
(),
cell
.
getCellStyle
().
getDataFormatString
()));
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录