Ошибка при вызове write () - PullRequest
       6

Ошибка при вызове write ()

0 голосов
/ 04 декабря 2011

У меня есть ошибка в строке:

    workbook.write();

Когда я пытаюсь отладить, я вижу массаж: «Источник не найден».

Как это исправить?

    private void exportExcel() throws IOException, WriteException{

    File file = new File(Environment.getExternalStorageDirectory() + "/backup.xls");

    WritableWorkbook workbook = Workbook.createWorkbook(file);
    workbook.createSheet("worksheet", 0);

    workbook.write();
    workbook.close();
    }

Заранее спасибо


WTF мой код выше начинает работать !!!

Когда я начал, я использовал jexcelapi по умолчанию.После этого я начинаю использовать альтернативный jexcelapi , но он также не работает.

Когда я пробую ваш код с небольшими изменениями - он работает!Ваш код:

    private void exportExcel() throws WriteException, IOException{

    File sdCard = Environment.getExternalStorageDirectory();
    File dir = new File(sdCard + "/myFolder");

    //make them in case they're not there
    dir.mkdirs();

    //create a standard java.io.File object for the Workbook to use
    File wbfile = new File(dir, "backup.xls");

    WritableWorkbook workbook = null;

    try{
      workbook = Workbook.createWorkbook(wbfile);
      workbook.createSheet("worksheet", 0);

      workbook.write();
      workbook.close();
    } catch (IOException ex) {
        Log.e("Workbook Test", "Could not create " + wbfile.getPath(), ex);
    }
}

Но когда я пытаюсь использовать приведенный выше код, он также работает.

Может быть, Eclipse не обновляется мгновенно с помощью библиотеки?

Большое спасибо!

PS Извините за мой плохой английский.

1 Ответ

0 голосов
/ 04 декабря 2011

Ваш код не проверяет, что каталог внешнего хранилища действительно доступен. Вам нужно позвонить getExternalStorageState и сравнить возвращаемое значение с различными значениями MEDIA_*, определенными в Environment. Если каталог недоступен, это может вызвать проблему.

Проблема также может заключаться в том, что вы пытаетесь записать в корень каталога внешнего хранилища. От документов :

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

EDIT

Попробуйте этот код:

File sdCard = Environment.getExternalStorageDirectory();
File dir = new File(sdCard + "/myFolder");

//make them in case they're not there
dir.mkdirs();

//create a standard java.io.File object for the Workbook to use
File wbfile = new File(dir, "backup.xls");

try{
  WritableWorkbook workbook = Workbook.createWorkbook(wbfile);
  workbook.createSheet("worksheet", 0);

  workbook.write();
  workbook.close();
} catch (IOException ex) {
  Log.e("Workbook Test", "Could not create " + wbfile.getPath(), ex);
}
return wb;

Это должно рассказать вам больше о том, что происходит.

РЕДАКТИРОВАТЬ 2

После небольшого исследования я обнаружил еще одну возможную проблему: JExcelApi использует много ресурсов при создании файла. Одним из решений является использование временного файла. Добавьте следующий код:

WorkbookSettings wbSettings = new WorkbookSettings();
wbSettings.setUseTemporaryFileDuringWrite(true);

и внутри блока try измените строку, в которой создается рабочая книга:

WritableWorkbook workbook = Workbook.createWorkbook(wbfile, wbSettings);
...