[英]How to read data from a file (word document, excel) with format in Java?
[英]How to read data from Excel (.xlsb) Binary File Format?
我正在使用 POI 3.9 從 xlsx 讀取數據。 但是現在我遇到了一個問題,POI 不支持 xlsb 文件,我需要從 xlsb 程序讀取數據。 有人知道如何以程序方式從 xlsb 讀取數據嗎? 贊賞。
Apache POI 在 3.16 中添加了對 XLSB 流式讀取的支持(無寫入支持)。 Apache Tika 1.15 現在支持從 XLSB 中提取。
在 Perl 中, Win32::OLE模塊可以將 XLSB 轉換為 XLSX。 缺點:您必須安裝 MS Excel。 這是一些基於我使用的示例代碼...
use File::Spec::Functions qw/rel2abs/;
use Win32::OLE;
use Win32::OLE::Const 'Microsoft Excel';
use Win32::OLE::Variant;
Win32::OLE->Option( Warn => 3 );
my $xlsb = 'C:\Users\wohlfarj\Documents\File.xlsb';
# This block uses an already open instance of Excel, or starts a new one if it isn't already open.
my $excel;
eval { $excel = Win32::OLE->GetActiveObject('Excel.Application') };
die 'MS Excel not installed' if $@;
unless (defined $excel) {
$excel = Win32::OLE->new( 'Excel.Application', 'Quit' )
or die 'Cannot start MS Excel';
}
# After all of the setup, converting the file is painless.
my $xlsx = rel2abs( $xlsb );
$xlsx =~ s/\.xlsb$/\.xlsx/i;
my $workbook = $excel->Workbooks->Open( {FileName => rel2abs( $xlsb )} );
$workbook->SaveAs( {FileFormat => xlOpenXMLWorkbook, Filename => $xlsx} );
$workbook->Close( {SaveChanges => xlDoNotSaveChanges} );
從這里開始, Spreadsheet::XLSX模塊可以很好地讀取 XLSX 副本。
使用 poi,您可以將 XLSB 讀取到 DB、Structure(XML,...)、List of Contents 等。
以下代碼將 XLSB 轉換為行列表/評論列表並映射以獲取額外信息。
只是您可以根據需要自定義代碼。
請從鏈接中找到許多示例; 感謝 poi 的作者。
// 主類
package excel;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.xssf.binary.XSSFBSharedStringsTable;
import org.apache.poi.xssf.binary.XSSFBSheetHandler;
import org.apache.poi.xssf.binary.XSSFBStylesTable;
import org.apache.poi.xssf.eventusermodel.XSSFBReader;
import org.xml.sax.SAXException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class Excel {
public static void main (String [] args){
String xlsbFileName = "C:\\Users\\full path to .xlsb file";
callXLToList(xlsbFileName);
}
static void callXLToList(String xlsbFileName){
OPCPackage pkg;
try {
pkg = OPCPackage.open(xlsbFileName);
XSSFBReader r = new XSSFBReader(pkg);
XSSFBSharedStringsTable sst = new XSSFBSharedStringsTable(pkg);
XSSFBStylesTable xssfbStylesTable = r.getXSSFBStylesTable();
XSSFBReader.SheetIterator it = (XSSFBReader.SheetIterator) r.getSheetsData();
List<XLSB2Lists> workBookAsList = new ArrayList<>();
int sheetNr = 1;
while (it.hasNext()) {
InputStream is = it.next();
String name = it.getSheetName();
System.out.println("Begin parsing sheet "+sheetNr+": "+name);
XLSB2Lists testSheetHandler = new XLSB2Lists();
testSheetHandler.startSheet(name);
XSSFBSheetHandler sheetHandler = new XSSFBSheetHandler(is,
xssfbStylesTable,
it.getXSSFBSheetComments(),
sst, testSheetHandler,
new DataFormatter(),
false);
sheetHandler.parse();
testSheetHandler.endSheet();
System.out.println("End parsing sheet "+sheetNr+": "+name);
sheetNr++;
// Add parsed sheet to workbook list
workBookAsList.add(testSheetHandler);
}
// For every sheet in Workbook
System.out.println("\nShort Report:");
for(XLSB2Lists sheet:workBookAsList){
// sheet content
System.out.println("Size of content: " +sheet.getSheetContentAsList().size());
// sheet comment
System.out.println("Size fo comment: "+sheet.getSheetCommentAsList().size());
// sheet extra info
System.out.println("Extra info.: "+sheet.getMapOfInfo().toString());
}
} catch (InvalidFormatException e) {
// TODO Please do your catch hier
e.printStackTrace();
} catch (IOException e) {
// TODO Please do your catch hier
e.printStackTrace();
} catch (OpenXML4JException e) {
// TODO Please do your catch hier
e.printStackTrace();
} catch (SAXException e) {
// TODO Please do your catch hier
e.printStackTrace();
}
}
}
// 解析類
package excel;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler;
import org.apache.poi.xssf.usermodel.XSSFComment;
/**
*
* @author Dominique
*/
public class XLSB2Lists implements XSSFSheetXMLHandler.SheetContentsHandler {
private final List sheetAsList = new ArrayList<>();
private List rowAsList;
private final List sheetCommentAsList = new ArrayList<>();
private List rowCommentAsList;
private final Map propertyMap = new HashMap<>();
public void startSheet(String sheetName) {
propertyMap.put("sheetName", sheetName);
}
@Override
public void startRow(int rowNum) {
rowAsList = new ArrayList<>();
rowCommentAsList = new ArrayList<>();
}
@Override
public void endRow(int rowNum) {
sheetAsList.add(rowNum, rowAsList);
sheetCommentAsList.add(rowNum, rowCommentAsList);
}
@Override
public void cell(String cellReference, String formattedValue, XSSFComment comment) {
formattedValue = (formattedValue == null) ? "" : formattedValue;
rowAsList.add(formattedValue);
if (comment == null) {
rowCommentAsList.add("");
} else {
propertyMap.put("comment author at "+comment.getRow()+":"+cellReference, comment.getAuthor());
rowCommentAsList.add(comment.getString().toString().trim());
}
}
@Override
public void headerFooter(String text, boolean isHeader, String tagName) {
if (isHeader) {
propertyMap.put("header tag", tagName);
propertyMap.put("header text", text);
} else { // footer
propertyMap.put("header tag", tagName);
propertyMap.put("header text", text);
}
}
public List getSheetContentAsList(){
return sheetAsList;
}
public List getSheetCommentAsList(){
return sheetCommentAsList;
}
public Map getMapOfInfo(){
return propertyMap;
}
}
POI 開發人員顯然沒有支持 XLSB 的計划: http ://mail-archives.apache.org/mod_mbox/poi-dev/201401.mbox/%3Calpine.DEB.2.02.1401250721280.31868%40urchin.earth.li%3E
這將是一項相當多的工作,因為你們都需要更新記錄以應對更長/不同的格式,然后重做所有編組的東西來處理它的完全不同的方式。 到目前為止,沒有人願意為了微不足道的利益而投入所有工作
似乎有一個用於讀取 xlsb的javascript 庫,您可以使用它來將數據導出為 JSON 並從 java 讀取。
這只是一個解決方法..
您可以將 xlsb 文件轉換為 xlsx 文件並使用 POI 從中提取數據。
你試過了嗎? 我知道這不是正確的答案,但希望它有所幫助。 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.