Файл Excel, созданный API-интерфейсом poi: данные есть, но доступна только одна строка? - PullRequest
1 голос
/ 21 января 2012

Я использовал простой код из онлайн code и смог вызвать метод в коде в цикле for и передать ему данные и номер строки. Файл создан правильно, размер файла (после обновления моего проводника) изменяется при каждой вставке, но когда я это сделаю, я открываю файл и вижу там только первую строку, и в тот момент, когда я закрываю ее, размер размер файла уменьшается с 1,5 МБ до 5 байт. Я открыл файл 1,5 МБ в notepadd ++ (конечно, он открывался с помощью байтовых символов). Я мог видеть данные, которые я записывал в файл, кроме первой строки. Все мои строки были там. но когда я открываю в Excel, это не так.

Есть что-то, чего мне здесь не хватает. При каждой вставке в файл Excel я делаю это:

fileOutputStream = new FileOutputStream(fileName,true);
sampleWorkbook.write(fileOutputStream);

и после этого в блоке finally блока try:

finally {
    /**
     * Close the fileOutputStream.
    */
    try {
        if (fileOutputStream != null) {
            fileOutputStream.flush();
            fileOutputStream.close();
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

но если размер файла меняется, и я могу просматривать данные в блокноте, почему Excel обрабатывает строки, отличные от первой, как временные данные (это то, что я предполагаю, что это происходит, поскольку возвращается только к 5 байт, когда я закрываю файл)? Что здесь не так?

Заранее спасибо за помощь.

Сайед.

Ответы [ 3 ]

2 голосов
/ 21 января 2012

Проблема в том, что xls не является простым форматом, и добавление строки в xls не означает добавление нескольких байтов в конец файла.Новые данные вставляются в середину файла, поэтому вам нужно полностью переписать весь файл.В примере кода вы просто записываете другую книгу после уже существующей, что делает содержимое файла недействительным.Поэтому, когда вы открываете его в Excel, он автоматически исправляет содержимое файла, удаляя все добавленные данные, кроме первой рабочей книги.

Используйте этот пример кода:

InputStream in = new FileInputStream (path);
Workbook sampleWorkbook;
try{
  sampleWorkbook = new HSSFWorkbook (in);//or XSSFWorkbook depending on whether you use xls or xlsx
} finally
{
  in.close ();
}

//Add some rows into the workbook

OutputStream out = new FileOutputStream (path);
try{
  sampleWorkbook.write (out);
} finally
{
  out.close ();
}
0 голосов
/ 21 января 2012

Если вы можете позволить себе коммерческое решение, взгляните на Templater . Это очень просто в использовании. Отказ от ответственности: я автор.

0 голосов
/ 21 января 2012

Возможно, это не имеет отношения к вашему вопросу, но для облегчения генерации Excel рекомендуется использовать JXLS (http://jxls.sourceforge.net/), который построен на основе POI. Прекрасная часть JXLS - это возможность создавать шаблон Excel (используя Excel, конечно), а затем вы просто помещаете данные в шаблон. Он поддерживает базовые логические операции, включая if else и loop.

...