我正在尝试阅读大型Excel文件(大小约10MB,. xlsx)。
我正在使用下面的代码
Workbook xmlworkbook =WorkbookFactory.create(OPCPackage.openOrCreate(root_path_name_file));
但它显示了堆内存问题。
我还看到了StackOverflow的其他解决方案,其中一些是为了增加JVM,但我不想增加JVM。
问题1)我们不能使用SXSSF(流用户模型API)
,因为这仅用于编写或创建新工作簿。
我的唯一目标是获取工作表的命名范围的数量,工作表的总数及其大型Excel文件的工作表名称。
如果要求仅获取命名范围和工作表名称,则必须仅解析*. xlsx
ZIPPackage
中的/xl/workbook.xml
,因为这些信息都存储在那里。
这可以通过获取适当的<code>PackagePart</code>并从中解析<code>XML</code>来实现。对于解析<code>XML</code>,我最喜欢的是使用<code>StAX</code>。
获取所有工作表名称和定义的命名范围的示例代码:
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackagePart;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.Characters;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.XMLEvent;
import javax.xml.namespace.QName;
import java.io.File;
import java.util.regex.Pattern;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
class StaxReadOPCPackageParts {
public static void main(String[] args) {
try {
File file = new File("file.xlsx");
OPCPackage opcpackage = OPCPackage.open(file);
//get the workbook package part
PackagePart workbookpart = opcpackage.getPartsByName(Pattern.compile("/xl/workbook.xml")).get(0);
//create reader for package part
XMLEventReader reader = XMLInputFactory.newInstance().createXMLEventReader(workbookpart.getInputStream());
List<String> sheetNames = new ArrayList<>();
Map<String, String> definedNames = new HashMap<>();
boolean isInDefinedName = false;
String sheetName = "";
String definedNameName = "";
StringBuffer definedNameFormula = new StringBuffer();
while(reader.hasNext()){ //loop over all XML in workbook.xml
XMLEvent event = (XMLEvent)reader.next();
if(event.isStartElement()) {
StartElement startElement = (StartElement)event;
QName startElementName = startElement.getName();
if(startElementName.getLocalPart().equalsIgnoreCase("sheet")) { //start element of sheet definition
Attribute attribute = startElement.getAttributeByName(new QName("name"));
sheetName = attribute.getValue();
sheetNames.add(sheetName);
} else if (startElementName.getLocalPart().equalsIgnoreCase("definedName")) { //start element of definedName
Attribute attribute = startElement.getAttributeByName(new QName("name"));
definedNameName = attribute.getValue();
isInDefinedName = true;
}
} else if(event.isCharacters() && isInDefinedName) { //character content of definedName == the formula
definedNameFormula.append(((Characters)event).getData());
} else if(event.isEndElement()) {
EndElement endElement = (EndElement)event;
QName endElementName = endElement.getName();
if(endElementName.getLocalPart().equalsIgnoreCase("definedName")) { //end element of definedName
definedNames.put(definedNameName, definedNameFormula.toString());
definedNameFormula = new StringBuffer();
isInDefinedName = false;
}
}
}
opcpackage.close();
System.out.println("Sheet names:");
for (String shName : sheetNames) {
System.out.println("Sheet name: " + shName);
}
System.out.println("Named ranges:");
for (String defName : definedNames.keySet()) {
System.out.println("Name: " + defName + ", Formula: " + definedNames.get(defName));
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
下面的代码用于获取excel文件(.xlsx)的工作表名称 上面的代码存在的问题是,为一个9MB大小的文件创建需要占用大量内存(~700MB)&时间很长(5-6s)。即使将设置为也不会释放占用的内存(我知道可能被调用,也可能不被调用&JVM不会仅仅因为我将变量设置为null而释放内存) 我确实浏览了Workbook,XSSFWorkbook&根据我的理解,没有任何方法可以帮助我获得内存印记较低的工
问题内容: 我有以下代码用于获取excel文件的工作表名称(.xlsx) 我上面的代码存在的问题是,为9MB大小的文件创建文件需要花费大量内存(〜700MB)和较长时间(5-6s)。即使将设置为,也不会释放占用的内存(我知道可能会叫,也可能不会叫&JVM不会因为我将变量设置为null而释放内存) 我确实浏览了Workbook,XSSFWorkbook的文档,据我了解,没有任何方法可以帮助我获得内存
我目前正在使用Apache POI库生成Java中的excel文件。 但是,我找不到任何关于XSSF等效项的信息。有人知道有没有可能吗?
问题内容: 如何使用Apache POI在Excel文件中获取列名,以确保按预期顺序排列列。 问题答案: 或这个: 行索引从0开始。
我正在使用POI的事件API来处理大量的记录,而没有任何内存占用问题。这是它的参考资料。 当我处理XLSX表单时,我得到的日期值格式与excel表单中指定的格式不同。excel表格中列的日期格式为“dd-mm-yyyy”,因为我得到的值是“mm/dd/yy”格式。 有谁能告诉我如何得到excel表格中给出的实际格式。下面给出了代码段的引用。 在cell方法中获取日期列的formmatedValue
`router.post('/introcpn',function(req,res){var form=new formidable.incomingform();form.parse(req,function(err,fields,file){if(err)throw err;``console.log(file.images)}) `