我正在阅读使用POI的XSSF和SAX(事件API)的Excel文件。 Excel工作表有成千上万行,所以这是我发现有良好性能的唯一方法。 现在我想从一个特别的行读取Excel文件,例如第6行,因为这些Excel文件每天都会更新,而且我存储了最后一行,因此我只能读取新行。 我如何从一行开始? private void getExcelField(AcquisitionForm acquisitionForm) throws ExcelReadException, IOException{ InputStream stream=null; OPCPackage p=null; try{ p = OPCPackage.open(acquisitionForm.getDatatablePath(), PackageAccess.READ); ReadOnlySharedStringsTable strings = new ReadOnlySharedStringsTable(p); XSSFReader xssfReader = new XSSFReader(p); StylesTable styles = xssfReader.getStylesTable(); XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) xssfReader.getSheetsData(); int index = 0; //Test with one sheet iter.hasNext(); //(iter.hasNext()) { stream = iter.next(); String sheetName […]
我正在使用库 org.apache.poi XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream); 我尝试着 org.xml.sax 库,但无法将其转换为工作簿 注意:最后结果我希望返回XSSFWorkbook 上面的代码将会出现内存不足,任何帮助将提前感谢ThankQ
我试图从excel文件中获取date数据types,但是当他阅读时的输出是41306.038888888892。 这个值只是出现date,有没有办法得到正常的date? 我没有在网上find任何东西。 希望有人能帮忙 谢谢
我只是用Open XML SDK的DOM方法阅读一个大的xlsx文件。 它工作正常; 然而,这需要永远。 所以我想用SAX方法做同样的事情。 但是,我没有得到这个。 我在DOM方法中做的是为工作簿中的每个工作表获取工作表的名称。 然后我假定第一行有所有的列名。 接下来,我创build一个具有所有第一行中列出的属性的类。 之后,我读了其余的行。 对于每一行,我创build一个新的对象与我dynamic创build的自定义类。 然后,我遍历行中的每个单元格,以使用我得到的值填充对象。 这里是我用来完成我刚刚使用DOM方法描述的任务的代码。 public static List<Object> ConvertExcelArchiveToListObjects(string filePath) { … using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filePath, false)) { WorkbookPart wbPart = spreadsheetDocument.WorkbookPart; Sheets theSheets = wbPart.Workbook.Sheets; SharedStringTablePart sstPart = spreadsheetDocument.WorkbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault(); … var sheets = wbPart.Workbook.Sheets.Cast<Sheet>().ToList(); foreach (WorksheetPart worksheetpart in wbPart.WorksheetParts) { Worksheet worksheet = worksheetpart.Worksheet; […]
我正在努力的地方,我需要阅读和大型xlsx转换为CSV文件。 我需要读取每行中特定数量的单元格(预定义)。 inputxlsx表单包含100万条logging,最大150 MB大小。 我已经使用POI API。 它工作正常与小xlsx文件和大文件抛出Java堆空间错误。 请看下面的代码并提供解决scheme。 我不太了解Event / SAXParser api,并假设它将适合读取大的xls文件。 package test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Iterator; import org.apache.commons.lang.StringUtils; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class XLSXToCSVConverterNew { public static void xlsx(File inputFile, File outputFile,int expectedColumns) { // For storing data into CSV files StringBuffer data = […]
我有一个从这个xml文件的Excel文件现有的base64编码,我想保存该数据(fileContent)到一个物理的Excel文件,但我坚持这样做。 我已经看过一些关于如何对它进行编码的教程,但是我不能将它保存到可以用Microsoft Excel打开的文件中。 我尝试的解决scheme打印所有的数据作为excel条目(见附图)。 我在这里问了一个相关的问题 ,但我不知道编码的数据是一个实际的.xls文件。 这是这样的代码: package parsing; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.bind.DatatypeConverter; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SaxSample { public static void main(String argv[]) { try { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser […]
我正在尝试使用OpenXML(SAX方法)创build一个Excel文档。 当我的方法被调用时,我想检查是否已经为一个给定的键创build一个选项卡。 如果是我想只追加到该选项卡的底部一行。 如果该选项卡没有创build给定的键我创build一个新的选项卡,如; part = wbPart.AddNewPart<WorksheetPart>(); string worksheetName = row.Key[i].ToString(); Sheet sheet = new Sheet() { Id = document.WorkbookPart.GetIdOfPart(part), SheetId = sheetNumber, Name = worksheetName }; sheets.Append(sheet); writer = OpenXmlWriter.Create(part); writer.WriteStartElement(new Worksheet()); writer.WriteStartElement(new SheetData()); currentrow = 1; string header = Header + "\t" + wrapper.GetHeaderString(3, 2, -1); //need to fix WriteDataToExcel(header, currentrow, 0, writer); […]
我使用SAX方法parsing大文件:使用Open XML SDKparsing和读取大型Excel文件 这是我的修改版本(为简单起见,只获取行号) using (SpreadsheetDocument myDoc = SpreadsheetDocument.Open("BigFile.xlsx", true)) { WorkbookPart workbookPart = myDoc.WorkbookPart; WorksheetPart worksheetPart = workbookPart.WorksheetParts.First(); OpenXmlReader reader = OpenXmlReader.Create(worksheetPart); String rowNum; while (reader.Read()) { if (reader.ElementType == typeof(Row)) { if (reader.HasAttributes) rowNum = reader.Attributes.First(a => a.LocalName == "r").Value } } } 问题是这遍历每个项目/单元格/列/什么,只有当元素types是行。 是否有一个SAX的方式来循环只通过行,而不是工作表中的每个项目? 谢谢,
我是一个新的官方用户,我总是在这里find我的答案,但现在我必须问。 我正在使用最后一个apache-poi 3.8版本(从2012/03/26开始),我必须使用多个工作表来处理单个文件,其中只有一个包含大量数据(超过1000列和10000行)。 我只需要有更多的专栏到大单。 因此,对于现有的工具,我应该使用SAX来读取它,SXSSF来重写它。 Excel文件已经在每张表格中以不同的样式和图像进行了格式化,因此能够在不使用大表格的情况下制作文件的副本。 有我的问题:我怎样才能使用SAX(从inputstream中)没有parsing它的工作表副本? 我试图像这样做,但XSSFWorkbook的字段sheets的可见性设置为私有。 真棒的事情将是有像SXSSFWriter.SheetIterator东西,如果它在未来的POI开发者计划。 谢谢阅读, 亚瑟 **更新* * 该文件太大,无法将其作为常见的XSSFWorkbook(OutOfMemoryException)打开。 有可能从InputStream创build和XSSFSheet? 如下所示: XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) xssfReader .getSheetsData(); int index = 0; while (iter.hasNext()) { InputStream stream = iter.next(); String sheetName = iter.getSheetName(); if (!sheetName.equalsIgnoreCase("BigSheetThatIDontWant")) { Sheet newSheet = new XSSFSheet(stream); stream.close(); } ++index; } 非常感谢你的回答。
我想合并单元格是excel。 通过使用DOM方法,我可以轻松完成。 但是,因为我的Excel文件太大,当我试图获得工作表,它会抛出内存exception。 所以我必须使用SAX方法来读取excel文件。 但是我不知道如何在这种方法中合并单元格。 search了很多,但每一个给DOM解决scheme。 任何人都可以帮助,预先感谢。