所以,这是我的任务。我在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可能会因为这么多的键值对而失败?
答案 0 :(得分:1)
您在寻找什么类型的电子表格?哪种格式?
有些库可以编写电子表格,如:
如果生成的电子表格很大,那么您应该避免使用这种库并考虑某种格式,如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();
}