如何在java中编写大量的电子表格?

时间:2014-12-24 02:05:10

标签: java bigdata spreadsheet google-docs mapdb

所以,这是我的任务。我在Java中的MapDB数据库上有大量数据。我需要创建一个电子表格并将其导入谷歌文档。

电子表格将有大约2000万行和3000列,并且每个行和列相遇的位置将有一个整数值数组(其中一些数组将为空或null)。因此,总共约有600亿个阵列。

我必须遍历数据库,电子表格中的每个行 - 列对都将在我迭代数据库时确定。

我该如何解决这个问题?我使用什么格式的文件,或者我该怎么办?感谢。

编辑:

我有个主意。我可以创建一个新的MapDB文件,它将行列组合作为键,将整数数组作为值。它会像这样出现:

static class RowColumn implements Serializable
{
    final String row;
    final String column;

    public RowColumn(String r, String c)
    {
        row = r;
        column = c;
    }
}

public static void main(String[] args)
{
    DB thedb = DBMaker.newTempFileDB().make();

    HTreeMap<RowColumn, Integer[]> spreadsheetMap = thedb.getHashMap("spreadsheet");

    //do some stuff here to iterate through last DB and get data
    //
    //stuff...
}

现在有了这个,我可以迭代它并创建一个电子表格。但是,如何以我可用于导入谷歌文档的格式编写电子表格?

EDIT2:

或者我应该使用BTreeMap,因为HTreeMap可能会因为这么多的键值对而失败?

1 个答案:

答案 0 :(得分:1)

您在寻找什么类型的电子表格?哪种格式?

有些库可以编写电子表格,如:

  1. Apache POI

  2. jXLS

  3. jOpenDocument

  4. Google API through GData
  5. 如果生成的电子表格很大,那么您应该避免使用这种库并考虑某种格式,如CSV(数据库的普通转储)。如果你对格式有自由,那么我建议使用ods或xlsx这样的开放格式。

    请记住,电子表格不是DB的替代品,不要尝试生成包含2000万行的电子表格,大多数应用程序(如果不是全部)都无法打开它。

    目的是什么?做个备份?生成的文档将由用户或应用程序使用(打开,处理)?

    修改

    以下是使用Apache POI以Microsoft开放格式编写电子表格的示例(然后您可以上传并使用Google文档上的文件)

        public void method() throws IOException {
        // your spreadsheet workbook
        org.apache.poi.xssf.streaming.SXSSFWorkbook wb = new org.apache.poi.xssf.streaming.SXSSFWorkbook();
        wb.setCompressTempFiles(true);        
        org.apache.poi.xssf.streaming.SXSSFSheet sheet = (org.apache.poi.xssf.streaming.SXSSFSheet) wb.createSheet();
        sheet.setRandomAccessWindowSize(100);// keep 100 rows in memory, exceeding rows will be flushed to disk
    
        // here you will iterate over your collection and store what you need on the sheet
        int rowsToWrite = 3000;
        for (int rowIndex = 0; rowIndex < rowsToWrite; rowIndex++) {
            int[] cellContent = null;
            org.apache.poi.ss.usermodel.Row row = sheet.createRow(rowIndex);
            for (int columnIndex = 0; columnIndex < 1; columnIndex++) {
                row.createCell(columnIndex).setCellValue(Arrays.toString(cellContent));
            }
        }
        // save your workbook to some file
        FileOutputStream out = new FileOutputStream("yourfilename.xlsx");
        wb.write(out);
        out.close();
    }