3

Javaでjexcel APIを使用しています。xls の特定の列の値を読み取る必要があり、それに基づいて xls の行全体を並べ替える必要があります。次に、これらの行を並べ替えて新しい xls に保存する必要があります。TreeMap を使用してそれを行うことはできますが、memmoryOutOfBound 例外が発生する可能性があります。

だから私は効率的な方法が必要です。ソートコードは非常に役立ちます。Treemap by jexcel を使用して私のコード実装を見つけてください

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 の 3 つの列があります。既に並べ替えられている TreeMap を追加して、age 列の値を使用して行を並べ替えています。しかし、これは効率的な方法ではありません。可能であれば、他のサンプル コードを提供してください。

4

1 に答える 1

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 オブジェクトの List を作成し、元のスプレッドシートを閉じて List を並べ替え、並べ替えたリストから新しいスプレッドシートを書き出すことができます。

于 2013-01-17T18:11:21.373 に答える