Java中Excel电子表格数据的高效读取算法

Java中Excel电子表格数据的高效读取算法,java,algorithm,excel,api,Java,Algorithm,Excel,Api,我正在做一个小项目,它将电子表格中的party(又名client)数据读入两个HashMap。一个跟踪各方,其值为对象方,另一个嵌入在跟踪各方数据的方对象中。问题是,我的方法是使用两个for循环,我们都知道这是一个O(N^2)算法。现在的方式是大约500行(或500个参与方)和大约65列(或65个标签/值),因此在元素的数量上,这并不是什么大问题。但是,有人告诉我,它可能需要处理2500多万行,在这种情况下,O(N^2)是一个问题(从技术上讲,我猜列的数量不是O(N^2),但列的数量可以扩展,不

我正在做一个小项目,它将电子表格中的party(又名client)数据读入两个HashMap。一个跟踪各方,其值为对象方,另一个嵌入在跟踪各方数据的方对象中。问题是,我的方法是使用两个for循环,我们都知道这是一个O(N^2)算法。现在的方式是大约500行(或500个参与方)和大约65列(或65个标签/值),因此在元素的数量上,这并不是什么大问题。但是,有人告诉我,它可能需要处理2500多万行,在这种情况下,O(N^2)是一个问题(从技术上讲,我猜列的数量不是O(N^2),但列的数量可以扩展,不一定设置为65)

长话短说,我需要关于如何减少运行时间的提示,但我真的想不出任何其他方法来访问工作表中的每个单元格

以下是相关代码:

package storage;

import java.io.File;
import java.util.HashMap;


import jxl.Sheet;
import jxl.Workbook;

import pojo.Party;

public class PartyStructure {

    private static HashMap<String, Party> map;
    private static PartyStructure partyStructure;
    private String inputFile = "C:/Users/joayers/Documents/API Project Information/Sample Data.xls";
    File excelData = new File(inputFile);

    private PartyStructure() throws Exception
    {
        map = new HashMap<String, Party>();
        readData();
    }

    public static HashMap<String,Party> getPartyCollection() throws Exception
    {
        if(partyStructure==null)
        {
            partyStructure = new PartyStructure();
        }
        return map;
    }
    private void readData() throws Exception 
    {
        Workbook w=Workbook.getWorkbook(excelData);
        Sheet sheet = w.getSheet(0);
        String party_name;
        String labelName;
        String dataField;

        for(int i=1;i<sheet.getRows();i++)
        {
            party_name = sheet.getCell(2, i).getContents().toString();
            //map is a Hashmap<String, Party> 
            map.put(party_name, new Party());

                for(int j=0;j<sheet.getColumns();j++)
                {
                    labelName = sheet.getCell(j, 0).getContents().toString();
                    dataField = sheet.getCell(j, i).getContents().toString();
                    Party party = map.get(party_name);
                    //getPartyInfo is a getter for a HashMap<String, String> that holds values associated with the keys (the labels in excel)
                    party.getPartyInfo().put(labelName, dataField);
                }
        }   
    }

}
包装储存;
导入java.io.File;
导入java.util.HashMap;
进口jxl.Sheet;
导入jxl.工作簿;
进口方;
公共类party结构{
私有静态哈希映射;
私有静态部分结构;
私有字符串inputFile=“C:/Users/joayers/Documents/API项目信息/Sample Data.xls”;
文件excelData=新文件(inputFile);
private PartyStructure()引发异常
{
map=新的HashMap();
readData();
}
公共静态HashMap getPartyCollection()引发异常
{
if(partyStructure==null)
{
零件结构=新零件结构();
}
返回图;
}
私有void readData()引发异常
{
工作簿w=Workbook.getWorkbook(excelData);
图纸=w.getSheet(0);
字符串方名称;
字符串标签名;
字符串数据字段;

对于(int i=1;i,我建议的第一件事是将声明置于循环之外(之前):

String party_name = sheet.getCell(2, i).getContents().toString();    // etc.
String party_name = "";    // etc.
和labelName、dataField、party。在循环之前声明:

String party_name = sheet.getCell(2, i).getContents().toString();    // etc.
String party_name = "";    // etc.

您还没有说明您使用的Excel库。例如,有些库可以缩小您正在搜索的单元格的范围,并且(可能)方法从一个范围填充数组。

如果您必须读取所有单元格,并在哈希映射中收集内容,则可以考虑并行化该任务:您可以按行划分任务:在工作表中有一些线程在不同区域上工作。

在您的例子中,您可能会在单独的映射中收集线程结果,最后您可以将其放在一起(因此无需在哈希映射上进行同步)


HashMap
未同步,
Hashtable
已同步().

在循环之前声明字段有什么好处?它节省内存吗?另外,更新为包含整个类,我正在使用jxl库。我不知道编译器是否会优化您当前的代码,或者它会带来什么性能改进。但是,简单地说,不需要在循环中不断重新声明变量。好的感谢我喜欢尽可能保持良好的风格,除了表中的所有内容外,没有指定的范围。是否有任何方法可以将运行时间减少N倍或可能是一个大常量?我只是快速查看了一下,但jxl库看起来有点旧,可能有限。其他人可能会推荐一个更好的库。如果你能抓住如果Excel文件只包含一个表,那么应该可以将其视为一个数据库,并使用数据库连接将数据读入记录集。不过,我还没有用Java完成这项工作。我想,到目前为止,我在学校有一项作业,我必须用c创建多个线程,这更像是一个“只需插入此代码,不必担心它会做什么”,而不是一个关于如何创建多线程程序的分配。这肯定是我需要研究的问题。我不确定说算法是O(N^2)是否正确。这里N是单元格数,所以这是O(N)Excel中的行限制在百万范围内()加上我认为Raedwald在这一点上是正确的,所以这里没有问题。令人尴尬的是,现在我想起来,你是完全正确的