Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中读取超过100000行的excel文件?_Java_Excel_String_Collections_Apache Poi - Fatal编程技术网

如何在java中读取超过100000行的excel文件?

如何在java中读取超过100000行的excel文件?,java,excel,string,collections,apache-poi,Java,Excel,String,Collections,Apache Poi,我正在尝试使用ApachePOI读取java中超过100000行的excel文件。但我遇到了一些问题 1-)从excel文件中获取数据需要10到15分钟 2-)当我运行代码时,我的笔记本电脑开始挂起。正因为如此,获取数据变得很困难,然后我不得不重新启动我的笔记本电脑 有没有其他方法可以让我用java在更短的时间内从excel文件中获取数据 这是我目前的代码: public class ReadRfdsDump { public void readRfdsDump() {

我正在尝试使用ApachePOI读取java中超过100000行的excel文件。但我遇到了一些问题

1-)从excel文件中获取数据需要10到15分钟

2-)当我运行代码时,我的笔记本电脑开始挂起。正因为如此,获取数据变得很困难,然后我不得不重新启动我的笔记本电脑

有没有其他方法可以让我用java在更短的时间内从excel文件中获取数据

这是我目前的代码:

public class ReadRfdsDump {

    public void readRfdsDump() {
        try {
            FileInputStream file = new FileInputStream(new File("C:\\Users\\esatnir\\Videos\\sprint\\sprintvision.sprint.com_Trackor Browser_RF Design Sheet_07062018122740.xlsx"));
             XSSFWorkbook workbook = new XSSFWorkbook(file);
             XSSFSheet sheet = workbook.getSheetAt(0);
             DataFormatter df = new DataFormatter();

             for(int i=0;i<2;i++) {
                 Row row= sheet.getRow(i);
                 System.out.println(df.formatCellValue(row.getCell(1)));
             }
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
}
公共类ReadRfdsDump{
public void readRfdsDump(){
试一试{
FileInputStream文件=新的FileInputStream(新文件(“C:\\Users\\esatnir\\Videos\\sprint\\sprintvision.sprint.com\u Tracker浏览器\u RF设计表\u 07062018122740.xlsx”);
XSSF工作簿=新XSSF工作簿(文件);
XSSFSheet sheet=workbook.getSheetAt(0);
DataFormatter df=新的DataFormatter();
对于(inti=0;iApachePOI是您的朋友-这是正确的。但当我阅读带有公式的大型Excel时,我面临着OutOfMemory

我的解决方案。如果您只想从XLSX文件中读取数据,而不必担心公式,那么请将其作为simple xml文件读取并从中提取数据(这非常简单)

  • 将*.xlsx文件作为zip存档文件读取
  • 进入
    xl\worksheets
    文件夹,您可以在每张工作表中找到一个xml文件
  • 使用任何xml读取器读取此文件并检索所需的数据

  • Apache poi
    的默认设置是使用
    WorkbookFactory打开工作簿。创建
    新建XSSFWorkbook
    将始终解析整个工作簿,包括所有工作表。如果工作簿包含大量数据,这将导致内存使用率高。使用
    文件打开工作簿,而不是使用
    输入流
    减少简化内存使用。但这会导致其他问题,因为使用的文件无法被覆盖,至少在
    *.xlsx
    文件时不能

    有两种方法可以获取底层XML数据,并使用
    SAX
    进行处理

    但是,如果我们已经达到了这个级别,可以获取并处理底层XML数据,那么我们也可以再后退一步

    *.xlsx
    文件是一个
    ZIP
    归档文件,包含目录结构中
    XML
    文件中的数据。因此,我们可以解压缩
    *.xlsx
    文件,然后从
    XML
    文件中获取数据

    /xl/sharedStrings.xml
    包含所有字符串单元格值。有
    /xl/workbook.xml
    描述工作簿结构。有
    /xl/worksheets/sheet1.xml
    /xl/worksheets/sheet2.xml
    ,…存储工作表数据。还有
    /xl/styles.xml
    包含他创建了图纸中所有单元格的样式设置

    因此,我们所需要的就是使用
    Java
    使用
    ZIP
    文件系统

    我们需要一种解析
    XML
    的可能性。这是我最喜欢的

    下面显示了一个工作草案。它解析
    /xl/sharedStrings.xml
    。也解析
    /xl/styles.xml
    。但它只获取数字格式和单元格数字格式设置。数字格式设置对于检测日期/时间值至关重要。然后它解析
    /xl/worksheets/sheet1.xml
    ,其中包含第一页的数据。为了检测数字格式是否为日期格式,因此格式化的单元格包含日期/时间值,使用了一个
    apache poi
    class
    org.apache.poi.ss.usermodel.DateUtil
    。这样做是为了简化代码。当然,即使是这个类,我们也可以自己编写代码

    import java.nio.file.Paths;
    import java.nio.file.Path;
    import java.nio.file.Files;
    import java.nio.file.FileSystems;
    import java.nio.file.FileSystem;
    
    import javax.xml.stream.*;
    import javax.xml.stream.events.*;
    import javax.xml.namespace.QName;
    
    import java.util.List;
    import java.util.ArrayList;
    import java.util.Map;
    import java.util.HashMap;
    import java.util.Date;
    
    import org.apache.poi.ss.usermodel.DateUtil;
    
    public class UnZipAndReadXLSXFileSystem {
    
     public static void main (String args[]) throws Exception {
    
      XMLEventReader reader = null;
      XMLEvent event = null;
      Attribute attribute = null;
      StartElement startElement = null; 
      EndElement endElement = null; 
    
      String characters = null;
      StringBuilder stringValue = new StringBuilder(); //for collecting the characters to complete values 
    
      List<String> sharedStrings = new ArrayList<String>(); //list of shared strings
    
      Map<String, String> numberFormats = new HashMap<String, String>(); //map of number formats
      List<String> cellNumberFormats = new ArrayList<String>(); //list of cell number formats
    
      Path source = Paths.get("ExcelExample.xlsx"); //path to the Excel file
    
      FileSystem fs = FileSystems.newFileSystem(source, null); //get filesystem of Excel file
    
      //get shared strings ==============================================================================
      Path sharedStringsTable = fs.getPath("/xl/sharedStrings.xml");
      reader = XMLInputFactory.newInstance().createXMLEventReader(Files.newInputStream(sharedStringsTable));
      boolean siFound = false;
      while (reader.hasNext()) {
       event = (XMLEvent)reader.next();
       if (event.isStartElement()){
        startElement = (StartElement)event;
        if (startElement.getName().getLocalPart().equalsIgnoreCase("si")) {
         //start element of shared string item
         siFound = true;
         stringValue = new StringBuilder();
        } 
       } else if (event.isCharacters() && siFound) {
        //chars of the shared string item
        characters = event.asCharacters().getData();
        stringValue.append(characters);
       } else if (event.isEndElement() ) {
        endElement = (EndElement)event;
        if (endElement.getName().getLocalPart().equalsIgnoreCase("si")) {
         //end element of shared string item
         siFound = false;
         sharedStrings.add(stringValue.toString());
        }
       }
      }
      reader.close();
    System.out.println(sharedStrings);
      //shared strings ==================================================================================
    
      //get styles, number formats are essential for detecting date / time values =======================
      Path styles = fs.getPath("/xl/styles.xml");
      reader = XMLInputFactory.newInstance().createXMLEventReader(Files.newInputStream(styles));
      boolean cellXfsFound = false;
      while (reader.hasNext()) {
       event = (XMLEvent)reader.next();
       if (event.isStartElement()){
        startElement = (StartElement)event;
        if (startElement.getName().getLocalPart().equalsIgnoreCase("numFmt")) {
         //start element of number format
         attribute = startElement.getAttributeByName(new QName("numFmtId"));
         String numFmtId = attribute.getValue();
         attribute = startElement.getAttributeByName(new QName("formatCode"));
         numberFormats.put(numFmtId, ((attribute != null)?attribute.getValue():"null"));
        } else if (startElement.getName().getLocalPart().equalsIgnoreCase("cellXfs")) {
         //start element of cell format setting
         cellXfsFound = true;
    
        } else if (startElement.getName().getLocalPart().equalsIgnoreCase("xf") && cellXfsFound ) {
         //start element of format setting in cell format setting
         attribute = startElement.getAttributeByName(new QName("numFmtId"));
         cellNumberFormats.add(((attribute != null)?attribute.getValue():"null"));
        }
       } else if (event.isEndElement() ) {
        endElement = (EndElement)event;
        if (endElement.getName().getLocalPart().equalsIgnoreCase("cellXfs")) {
         //end element of cell format setting
         cellXfsFound = false;
        }
       }
      }
      reader.close();
    System.out.println(numberFormats);
    System.out.println(cellNumberFormats);
      //styles ==========================================================================================
    
      //get sheet data of first sheet ===================================================================
      Path sheet1 = fs.getPath("/xl/worksheets/sheet1.xml");
      reader = XMLInputFactory.newInstance().createXMLEventReader(Files.newInputStream(sheet1));
      boolean rowFound = false;
      boolean cellFound = false;
      boolean cellValueFound = false;
      boolean inlineStringFound = false; 
      String cellStyle = null;
      String cellType = null;
      while (reader.hasNext()) {
       event = (XMLEvent)reader.next();
       if (event.isStartElement()){
        startElement = (StartElement)event;
        if (startElement.getName().getLocalPart().equalsIgnoreCase("row")) {
         //start element of row
         rowFound = true;
    System.out.print("<Row");
    
         attribute = startElement.getAttributeByName(new QName("r"));
    System.out.print(" r=" + ((attribute != null)?attribute.getValue():"null"));
    System.out.println(">");
    
        } else if (startElement.getName().getLocalPart().equalsIgnoreCase("c") && rowFound) {
         //start element of cell in row
         cellFound = true;
    System.out.print("<Cell");
    
         attribute = startElement.getAttributeByName(new QName("r"));
    System.out.print(" r=" + ((attribute != null)?attribute.getValue():"null"));
    
         attribute = startElement.getAttributeByName(new QName("t"));
    System.out.print(" t=" + ((attribute != null)?attribute.getValue():"null"));
         cellType = ((attribute != null)?attribute.getValue():null);
    
         attribute = startElement.getAttributeByName(new QName("s"));
    System.out.print(" s=" + ((attribute != null)?attribute.getValue():"null"));
         cellStyle = ((attribute != null)?attribute.getValue():null);
    
    System.out.print(">");
    
        } else if (startElement.getName().getLocalPart().equalsIgnoreCase("v") && cellFound) {
         //start element of value in cell
         cellValueFound = true;
    System.out.print("<V>");
         stringValue = new StringBuilder();
    
        } else if (startElement.getName().getLocalPart().equalsIgnoreCase("is") && cellFound) {
         //start element of inline string in cell
         inlineStringFound = true;
    System.out.print("<Is>");
         stringValue = new StringBuilder();
    
        }
       } else if (event.isCharacters() && cellFound && (cellValueFound || inlineStringFound)) {
        //chars of the cell value or the inline string
        characters = event.asCharacters().getData();
        stringValue.append(characters);
    
       } else if (event.isEndElement()) {
        endElement = (EndElement)event;
        if (endElement.getName().getLocalPart().equalsIgnoreCase("row")) {
         //end element of row
         rowFound = false;
    System.out.println("</Row>");
    
        } else if (endElement.getName().getLocalPart().equalsIgnoreCase("c")) {
         //end element of cell
         cellFound = false;
    System.out.println("</Cell>");
    
        } else if (endElement.getName().getLocalPart().equalsIgnoreCase("v")) {
         //end element of value
         cellValueFound = false;
    
         String cellValue = stringValue.toString();
    
         if ("s".equals(cellType)) {
          cellValue = sharedStrings.get(Integer.valueOf(cellValue));
         }
    
         if (cellStyle != null) {
          int s = Integer.valueOf(cellStyle);
          String formatIndex = cellNumberFormats.get(s);
          String formatString = numberFormats.get(formatIndex);
          if (DateUtil.isADateFormat(Integer.valueOf(formatIndex), formatString)) {
           double dDate = Double.parseDouble(cellValue); 
           Date date = DateUtil.getJavaDate(dDate);
           cellValue = date.toString();
          }
         }
    
    System.out.print(cellValue);
    System.out.print("</V>");
    
        } else if (endElement.getName().getLocalPart().equalsIgnoreCase("is")) {
         //end element of inline string
         inlineStringFound = false;
    
         String cellValue = stringValue.toString();
    System.out.print(cellValue);
    System.out.print("</Is>");
    
        }
       }
      }
      reader.close();
      //sheet data ======================================================================================
    
      fs.close();
    
     }
    }
    
    import java.nio.file.path;
    导入java.nio.file.Path;
    导入java.nio.file.Files;
    导入java.nio.file.FileSystems;
    导入java.nio.file.FileSystem;
    导入javax.xml.stream.*;
    导入javax.xml.stream.events.*;
    导入javax.xml.namespace.QName;
    导入java.util.List;
    导入java.util.ArrayList;
    导入java.util.Map;
    导入java.util.HashMap;
    导入java.util.Date;
    导入org.apache.poi.ss.usermodel.DateUtil;
    公共类unzipandreadxlsx文件系统{
    公共静态void main(字符串args[])引发异常{
    XMLEventReader=null;
    XMLEvent事件=null;
    属性=null;
    StartElement StartElement=null;
    EndElement EndElement=null;
    字符串=空;
    StringBuilder stringValue=new StringBuilder();//用于收集字符以完成值
    List sharedStrings=new ArrayList();//共享字符串列表
    Map numberFormats=new HashMap();//数字格式的映射
    List cellNumberFormats=new ArrayList();//单元格编号格式列表
    Path source=Path.get(“ExcelExample.xlsx”);//Excel文件的路径
    FileSystem fs=FileSystems.newFileSystem(source,null);//获取Excel文件的文件系统
    //获取共享字符串==============================================================================
    Path sharedStringsTable=fs.getPath(“/xl/sharedStrings.xml”);
    reader=XMLInputFactory.newInstance().createXMLEventReader(Files.newInputStream(sharedStringsTable));
    布尔siFound=false;
    while(reader.hasNext()){
    event=(XMLEvent)reader.next();
    if(event.isStartElement()){
    startElement=(startElement)事件;
    if(startElement.getName().getLocalPart().equalsIgnoreCase(“si”)){
    //共享字符串项的开始元素
    siFound=真;
    stringValue=新的StringBuilder();
    } 
    }else if(event.isCharacters()&&siFound){
    //共享字符串项的字符数
    characters=event.asCharacters().getData();
    stringValue.append(字符);
    }else if(event.isEndElement()){
    endElement=(endElement)事件;
    if(endElement.getName().getLocalPart().equalsIgnoreCase(“si”)){
    //共享字符串项的结束元素
    siFound=假;
    股票经纪人