在gui Java中上传大型.xlsx文件

时间:2018-08-06 16:58:09

标签: java excel apache-poi xlsx

我有一个包含600.000行的大型excel文件,我使用XSSFWorkbook将excel文件上传到GUI中的Jtable上,但是在Eclipse中大约需要15分钟才能完成,一旦我将项目导出到jar文件中,我就可以即使在15分钟内也不会这样做。有什么帮助吗? 这是我在互联网上发现的用于上传我的excel文件的方法。

void fillData(File file) {
    int index = -1;
    XSSFWorkbook workbook = null;
    try {
        try {
            String f = file.getPath();
            File file1 = new File(f);
            OPCPackage opcPackage = OPCPackage.open(file1);
            workbook = new XSSFWorkbook(opcPackage);
        } catch (IOException ex) {
            Logger.getLogger(ProjectApp3.class.getName()).log(Level.SEVERE, null, ex);
        }

        String[] strs = new String[workbook.getNumberOfSheets()];
        //get all sheet names from selected workbook
        for (int i = 0; i < strs.length; i++) {
            strs[i] = workbook.getSheetName(i);
        }
        JFrame frame = new JFrame("Input Dialog");
        //select sheet
        String selectedsheet = (String) JOptionPane.showInputDialog(
                frame, "Which worksheet you want to import ?", "Select Worksheet",
                JOptionPane.QUESTION_MESSAGE, null, strs, strs[0]);

        if (selectedsheet != null) {
            for (int i = 0; i < strs.length; i++) {
                if (workbook.getSheetName(i).equalsIgnoreCase(selectedsheet))
                    index = i;
            }
            XSSFSheet sheet = workbook.getSheetAt(index);
            XSSFRow row = sheet.getRow(0);
            //import headers data
            headers.clear();
            for (int i = 0; i < row.getLastCellNum(); i++) {
                XSSFCell cell1 = row.getCell(i);
                headers.add(cell1.toString());
            }
            //import data
            data1.clear();
            for (int j = 1; j < sheet.getLastRowNum() + 1; j++) {
                Vector d = new Vector();
                row = sheet.getRow(j);
                int noofrows = row.getLastCellNum();
                for (int i = 0; i < noofrows; i++) {    //To handle empty excel cells 
                    XSSFCell cell = row.getCell(i,
                            org.apache.poi.ss.usermodel.Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
                    d.add(cell.toString());
                }
                d.add("\n");
                data1.add(d);

            }
        } else {
            return;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

1 个答案:

答案 0 :(得分:0)

我认为基本问题是您要付出。您的Jtable在启动时的所有数据。这将是一个严重的问题。您可能想从AbstractTableModel编写一个自定义子类。请参阅包含以下内容的Jtable文档:

  TableModel dataModel = new AbstractTableModel() {
      public int getColumnCount() { return 10; }
      public int getRowCount() { return 10;}
      public Object getValueAt(int row, int col) { return new Integer(row*col); }
  };
  JTable table = new JTable(dataModel);
  JScrollPane scrollpane = new JScrollPane(table);

您可以根据POI提供的信息来实现这三种方法。但是要延迟加载数据,尤其是对于getValueAt()。保持电子表格文件处于打开状态,并仅在用户滚动查看时才获取数据。