首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在gui java中上传大型.xlsx文件

在gui java中上传大型.xlsx文件
EN

Stack Overflow用户
提问于 2018-08-07 00:58:09
回答 1查看 108关注 0票数 -2

我有一个包含600.000行的大型excel文件,我使用XSSFWorkbook在我的图形用户界面的Jtable中上传了excel文件,但在eclipse中需要大约15分钟才能完成,一旦我将项目导出到jar文件,我甚至无法在15分钟内完成。有什么需要帮忙的吗?这是我在互联网上找到的上传我的excel文件的方法。

代码语言:javascript
复制
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();
    }
}
EN

回答 1

Stack Overflow用户

发布于 2018-08-07 05:36:03

我认为最基本的问题是你试图给予。您的Jtable在启动时将所有数据。这将是一个很大的问题。您可能希望从AbstractTableModel编写自定义子类。请参阅Jtable的文档,其中包含以下内容:

代码语言:javascript
复制
  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()。使电子表格文件保持打开状态,仅当用户滚动查看时才抓取数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51712423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档