我在java中使用jexcel api。我需要阅读xls paticular列值,并且必须根据它对xls中的整行进行排序。然后我必须以新的xls中的排序方式保存这些行。我能够使用TreeMap做到这一点,但它为memmoryOutOfBound异常创造了可能性。
所以我需要一种有效的方法。任何排序代码都会有很大的帮助。请使用jexcel
的Treemap查找我的代码实现def sort() {
def wbSetting = nullenter code here
def writableWorkBook = null`enter code here`
def writableSheet = null`enter code here`
Workbook workbook = Workbook.getWorkbook(new File(grailsApplication.config.app.xls.path));
Sheet sheet = workbook.getSheet(0);
Cell[] flagCell = sheet.getColumn(1)
TreeMap map = new TreeMap (Collections.reverseOrder());
flagCell.each { flag ->
Cell firstName = sheet.getCell(0, flag.getRow());
Cell lastName = sheet.getCell(1, flag.getRow());
Cell ageCell = sheet.getCell(2,flag.getRow());
String first = firstName.getContents();
String last = lastName.getContents();
String age=ageCell.getContents()
if(!age.isEmpty())
{
map.put(age,first+"-"+last)
}
}
workbook.close()
wbSetting = new WorkbookSettings()
wbSetting.setUseTemporaryFileDuringWrite(true)
String filename = grailsApplication.config.app.calcfilesoutput.path
writableWorkBook = Workbook.createWorkbook(new File(filename), wbSetting)
writableSheet = writableWorkBook.createSheet("sheet1", 0)
int i=0
Iterator iterator= map.entrySet().iterator();
while(iterator.hasNext())
{
def it=iterator.next();
String fullName=map.get(it.getKey().toString())
String[] result=fullName.split("-")
String first=result[0]
String last=result[1]
writableSheet.addCell(new Label(0, i, first))
writableSheet.addCell(new Label(1, i, last))
writableSheet.addCell(new Label(2, i, it.getKey().toString()))
i++;
}
writableWorkBook.write();
writableWorkBook.close();
}
我的xls有三列,即firstname,lastname和age。我正在使用年龄列值对行进行排序,方法是在已经排序的TreeMap中添加。但这不是一种有效的方法。如果可能,请提供其他示例代码
答案 0 :(得分:0)
如果你发现Map太多的内存耗费,你可以创建一个小子类用作记录。使对象具有可比性。它大致会像这样:
private static class MyRecord implements Comparable<MyRecord>
{
int age;
String name;
@Override
public int compareTo(MyRecord o)
{
if (o == null)
{
return -1;
}
return (age - o.age);
}
}
然后,您可以创建这些MyRecord对象的列表,关闭原始电子表格,对列表进行排序,然后从排序列表中写出新的电子表格。