Как создать файл 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)
Ответы
Ответ 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 → Потяните его → Посмотрите.
Ответ 2
Вы можете попробовать http://jexcelapi.sourceforge.net/ (см. этот учебник для некоторой помощи) или Apache POI для записи или чтения из файлов Excel.
Ответ 3
Используйте http://sourceforge.net/projects/jexcelapi/files/jexcelapi/
Ответ 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. После того, как я сам столкнулся с той же проблемой, я пришел к выводу, что это сделать нелегко.
- Библиотека слишком велика для выполнения, что может привести к нежелательным накладным расходам.
- [Видимо] библиотека конфликтует с андроидом? Не уверен, одна из причин, приведенных товарищем 'Стек Overflower'?
Однако, если вам удалось найти решение, т.е. успешно [и эффективно] внедрить решение с использованием Apache POI, пожалуйста, опубликуйте решение.
Лучший.
Ответ 6
Сначала добавьте эти зависимости в ваше приложение build.gradle: затем следуйте другим ответам:
implementation 'org.apache.poi:poi:3.17'
implementation 'org.apache.poi:poi-ooxml:3.17'