Подтвердить что ты не робот

Как создать файл excel в android?

Мне нужно создать файл excel программно. Есть ли какой-либо API для создания файла excel или других способов?
РЕДАКТИРОВАТЬ 7 ноября 2011 года
Я попробовал пример Создать таблицу Excel из этой ссылки Создать таблицу Excel и я получаю NullPointerException в workbook.write();, используя это я могу создать файл excel на SD-карте, но когда я открою этот файл excel с помощью MS office 2007, я получаю сообщение Unable to read file
Здесь трассировка стека, ExcelStudy - это моя активность, которая использует WriteExcel class

W/System.err(  235): java.lang.NullPointerException
W/System.err(  235):    at jxl.biff.StringHelper.getUnicodeBytes(StringHelper.java:133)
W/System.err(  235):    at jxl.biff.FontRecord.getData(FontRecord.java:289)
W/System.err(  235):    at jxl.biff.WritableRecordData.getBytes(WritableRecordData.java:71)
W/System.err(  235):    at jxl.write.biff.File.write(File.java:132)
W/System.err(  235):    at jxl.biff.Fonts.write(Fonts.java:110)
W/System.err(  235):    at jxl.write.biff.WritableWorkbookImpl.write(WritableWorkbookImpl.java:699)
W/System.err(  235):    at comm.study.code.WriteExcel.write(WriteExcel.java:49)
W/System.err(  235):    at comm.study.code.ExcelStudy.createExcelFile(ExcelStudy.java:64)
W/System.err(  235):    at comm.study.code.ExcelStudy$1.onClick(ExcelStudy.java:47)
W/System.err(  235):    at android.view.View.performClick(View.java:2364)
W/System.err(  235):    at android.view.View.onTouchEvent(View.java:4179)
W/System.err(  235):    at android.widget.TextView.onTouchEvent(TextView.java:6541)
W/System.err(  235):    at android.view.View.dispatchTouchEvent(View.java:3709)
W/System.err(  235):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
W/System.err(  235):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
W/System.err(  235):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
W/System.err(  235):    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
W/System.err(  235):    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
W/System.err(  235):    at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
W/System.err(  235):    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
W/System.err(  235):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
W/System.err(  235):    at android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err(  235):    at android.os.Looper.loop(Looper.java:123)
W/System.err(  235):    at android.app.ActivityThread.main(ActivityThread.java:4363)
W/System.err(  235):    at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err(  235):    at java.lang.reflect.Method.invoke(Method.java:521)
W/System.err(  235):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
W/System.err(  235):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
W/System.err(  235):    at dalvik.system.NativeStart.main(Native Method)
4b9b3361

Ответ 1

Сначала вам нужно перейти по этой ссылке, с которой вы можете загрузить последнюю библиотеку:

http://www.apache.org/dyn/closer.cgi/poi/release/bin/poi-bin-3.9-20121203.tar.gz

После этого поставьте ниже код на onCreate или onResume Mehod:

HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet firstSheet = workbook.createSheet("Sheet No: 1");
HSSFSheet secondSheet = workbook.createSheet("Sheet No: 2");
HSSFRow rowA = firstSheet.createRow(0);
HSSFCell cellA = rowA.createCell(0);
cellA.setCellValue(new HSSFRichTextString("Sheet One"));
HSSFRow rowB = secondSheet.createRow(0);
HSSFCell cellB = rowB.createCell(0);
cellB.setCellValue(new HSSFRichTextString("Sheet two"));
FileOutputStream fos = null;
try {
    String str_path = Environment.getExternalStorageDirectory().toString();
    File file ;
    file = new File(str_path, getString(R.string.app_name) + ".xls");
    fos = new FileOutputStream(file);
    workbook.write(fos);
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (fos != null) {
        try {
            fos.flush();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    Toast.makeText(MainActivity.this, "Excel Sheet Generated", Toast.LENGTH_SHORT).show();
}

//Чтобы увидеть этот файл excel, перейдите в Проводник в eclipse → Путь SDCard → Excel.xls → Потяните его → Посмотрите.

Ответ 4

bean класс

  class Bean {       Строка initial, firstName, middleName, lastName;
       Bean (String initial, String firstName, String middleName, String lastName) {           this.initial = initial;           this.firstName = firstName;           this.middleName = middleName;           this.lastName = lastName;       }
       public String getInitial() {           return initial;       }
       public String getFirstName() {           return firstName;       }
       public String getMiddleName() {           return middleName;       }
       public String getLastName() {           return lastName;       }
   }
Код>

код для создания ExcelSheet

sheet.addCell(новая метка (0, 0, "NameInitial" ))

sheet.addCell(новый ярлык (columnNumber, rowNumber, dataString));

  Каталог файлов, sd, файл;   WritableWorkbook workbook;
   void createExcelSheet() {       String csvFile =  "ExcelsheetName.xls";       sd = Environment.getExternalStorageDirectory();       directory = new File (sd.getAbsolutePath());       file = new Файл (каталог, csvFile);       WorkbookSettings wbSettings = new WorkbookSettings();       wbSettings.setLocale(новый язык ( "en", "EN" ));       пытаться {           workbook = Workbook.createWorkbook(файл, wbSettings);           createFirstSheet();           createSecondSheet();           // закрытие курсора           workbook.write();           workbook.close();       } catch (Исключение e) {           e.printStackTrace();       }   }
   void createFirstSheet() {       пытаться {           Список < Бин > listdata = new ArrayList <>();
           listdata.add(новый бит (   "mr"  ,    "firstName1"  ,    "middleName1"  ,    "lastName1"   ));           listdata.add(новый бит (   "mr"  ,    "firstName1"  ,    "middleName1"  ,    "lastName1"   ));           listdata.add(новый бит (   "mr"  ,    "firstName1"  ,    "middleName1"  ,    "lastName1"   ));           // Имя листа Excel. 0 (число) представляет собой первый лист           WritableSheet sheet = workbook.createSheet( "sheet1", 0);           // Заголовок столбца и строки           sheet.addCell(новая метка (0, 0, "NameInitial"  ));           sheet.addCell(новая метка (1, 0,  "firstName" ));           sheet.addCell(новая метка (2, 0,  "middleName" ));           sheet.addCell(новая метка (3, 0,  "lastName" ));
           for (int я = 0; я < listdata.size(); я ++) {               sheet.addCell(новая метка (0, я + 1, listdata.get(i).getInitial()));               sheet.addCell(новая метка (1, я + 1, listdata.get(i).getFirstName()));               sheet.addCell(новая метка (2, я + 1, listdata.get(i).getMiddleName()));               sheet.addCell(новая метка (3, я + 1, listdata.get(i).getLastName()));           }       } catch (Исключение e) {           e.printStackTrace();       }
   }
   void createSecondSheet() {
       пытаться {           Список < Бин > listdata = new ArrayList <>();           listdata.add(новый бит (   "mr"  ,    "firstName1"  ,    "middleName1"  ,    "lastName1"   ));           listdata.add(новый бит (   "mr"  ,    "firstName1"  ,    "middleName1"  ,    "lastName1"   ));           listdata.add(новый бит (   "mr"  ,    "firstName1"  ,    "middleName1"  ,    "lastName1"   ));           // Имя листа Excel. 0 (число) представляет собой первый лист           WritableSheet sheet = workbook.createSheet( "sheet2", 0);           // Заголовок столбца и строки           sheet.addCell(новая метка (0, 0, "NameInitial"  ));           sheet.addCell(новая метка (1, 0,  "firstName" ));           sheet.addCell(новая метка (2, 0,  "middleName" ));           sheet.addCell(новая метка (3, 0,  "lastName" ));
           for (int я = 0; я < listdata.size(); я ++) {               sheet.addCell(новая метка (0, я + 1, listdata.get(i).getInitial()));               sheet.addCell(новая метка (1, я + 1, listdata.get(i).getFirstName()));               sheet.addCell(новая метка (2, я + 1, listdata.get(i).getMiddleName()));               sheet.addCell(новая метка (3, я + 1, listdata.get(i).getLastName()));           }       } catch (Исключение e) {           e.printStackTrace();       }
   }
Код>

Чтение данных из ExcelSheet

  public void readDataFromExcelSheet() {       Список < Бин > listOfBean = new ArrayList <>();       пытаться {           String filename =  "ExcelsheetName.xls";           // Создание входного потока           Файл sd = Environment.getExternalStorageDirectory();           Каталог файлов = новый файл (sd.getAbsolutePath());           Файл file = новый файл (каталог, имя файла);           Workbook workbook = null;           WorkbookSettings ws = new WorkbookSettings();           ws.setGCDisabled(истина);           workbook = Workbook.getWorkbook(файл, ws);
           int noOfSheets = workbook.getNumberOfSheets();//это возврат количества листов, доступных в excelsheet           String sheetsNames [] = workbook.getSheetNames();//это возвращает все имена листов, доступные в excelsheet           for (int x = 0; x < noOfSheets; x ++)//здесь принимают все листы           {               Лист лист = workbook.getSheet(x);//здесь я взял первый лист               int rowCount = sheet.getRows();//подсчитывает общее количество строк или данных на этом листе               for (int я = 0; я < rowCount; я ++) {//принимать данные каждой строки                   Cell [] column = sheet.getRow(i);//принимает все данные одной строки
               /*                для получения данных по одному столбцу               */                   for (int j = 0; j < column.length; j ++) {//принимать данные каждого столбца строки                       System.out.print( "+ column [j].getContents() +" \ t");//принимать по одному данные                   }               /*                для получения данных столбцов               */                   listOfBean.add(новый Bean (столбец [0].getContents(), column [1].getContents(), column [2].getContents(), column [3].getContents()));
               }

// если вы хотите брать разные данные с разных листов, используйте случай переключения               Лист лист1;               int rowCount1;               переключатель (x) {                   случай 0:                       // писать код для листа 0 считанные данные                       sheet1 = workbook.getSheet(0);//здесь я взял первый лист                       rowCount1 = sheet1.getRows();//подсчитывает общее количество строк или данных на этом листе                       for (int я = 0; я < rowCount1; я ++) {//принимать данные каждой строки                           Cell [] column = sheet1.getRow(i);//принимает все данные одной строки                           listOfBean.add(новый Bean (столбец [0].getContents(), column [1].getContents(), column [2].getContents(), column [3].getContents()));                       }                       ломать;                   Дело 1:                       // писать код для чтения 1-го листа                       sheet1 = workbook.getSheet(1);//здесь я взял первый лист                       rowCount1 = sheet1.getRows();//подсчитывает общее количество строк или данных на этом листе                       for (int я = 0; я < rowCount1; я ++) {//принимать данные каждой строки                           Cell [] column = sheet1.getRow(i);//принимает все данные одной строки                           listOfBean.add(новый Bean (столбец [0].getContents(), column [1].getContents(), column [2].getContents(), column [3].getContents()));                       }                       ломать;               }

           }
       } catch (Исключение e) {           e.printStackTrace();       }   }
Код>

Ответ 5

Прекратите рекомендовать Apache POI как средство для получения желаемого решения - экспорта файлов Excel. После того, как я сам столкнулся с той же проблемой, я пришел к выводу, что это сделать нелегко.

  1. Библиотека слишком велика для выполнения, что может привести к нежелательным накладным расходам.
  2. [Видимо] библиотека конфликтует с андроидом? Не уверен, одна из причин, приведенных товарищем 'Стек Overflower'?

Однако, если вам удалось найти решение, т.е. успешно [и эффективно] внедрить решение с использованием Apache POI, пожалуйста, опубликуйте решение.

Лучший.

Ответ 6

Сначала добавьте эти зависимости в ваше приложение build.gradle: затем следуйте другим ответам:

implementation 'org.apache.poi:poi:3.17'
implementation 'org.apache.poi:poi-ooxml:3.17'