Поиск по этому блогу

понедельник, 17 февраля 2014 г.

Работа с MS Excel в Android


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

Для работы с MS Excel вам понадобятся библиотеки от Apache, которые называются POI, скачать вы их можете софициальной страницы Apache. Но я вам дам два главных файла которые нам нужны для чтения простого файла таблицы. 

Файлы либ — раздва

Дальше когда вы скачали эти файлы, закиньте их в своем проекте в папку libs/. Если они автоматически не импортировались в Build settings то кликайте правой кнопкой по ним и выберите Build -> add to build path, после этого либы должны импортироваться в проект.

Далее нам нужен файла, создайте простой Excel файл, я создал вот такой:
image

Кстати я ранее не говорил но желательно создавать файл образца Excel 97 — 2003, потому что далее начали делать файлы с другим шифрованием и почему то для чтения этих файлов нужны танцы с бубном.

Теперь файл который вы создали нужно положить в папку asset/ в которой обычно хранятся разного рода файлы. Далее мы будем из нее будем открывать наш .xls файл.

С подготовкой окончено, теперь приступим к программированию. Для начала выведем просто первые два стобца во втором поле. В нашей activity мы добавляем в OnCreate() вот такой код:

import java.util.Random;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        try {
            //открываем файл
            Workbook wb = WorkbookFactory.create(getAssets().open("test.xls"));
            //перем первую страницу
          Sheet sheet = wb.getSheetAt(0);
          //читаем первое поле (отсчет полей идет с нуля) т.е. по сути читаем второе
          Row row = sheet.getRow(1);
          //читаем столбцы
          Cell name = row.getCell(0);
          Cell age = row.getCell(1);
          //отображаем текстовые данные + цифровые
          Log.d("",name.getStringCellValue() + " " + age.getNumericCellValue());
          
         } catch(Exception ex) {
             return;
         }
    }
}

Вывод:
Коля 22.0


Я сильно не заморачивался и выводить буду в лог, так быстрей и проще (: Как видно код простой до безобразия, в начале открываем файл, дальше читаем лист с данными, и переходим к нужному полю и столбцу, и выводим то что нам нужно.

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

try {
            //открываем файл
            Workbook wb = WorkbookFactory.create(getAssets().open("test.xls"));
            //перем первую страницу
          Sheet sheet = wb.getSheetAt(0);
          //добавляем цикл для чтения всехзаполненых полей, getPhysicalNumberOfRows() знает точное количество
          for(int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {
           Row row = sheet.getRow(i);
              //читаем столбцы
              Cell name = row.getCell(0);
              Cell age = row.getCell(1);
              //отображаем текстовые данные + цифровые
              Log.d("",name.getStringCellValue() + " " + age.getNumericCellValue());
          }
          
         } catch(Exception ex) {
             return;
         }


Вывод:
Вася 12.0
Коля 22.0
Игорь 23.0
Маша 45.0
Ирина 32.0

Вот собственно такой короткий экскурс в чтение файлов MS Excel, если лень создавать базы и все такое, то очень удобно использоваться именно такой способ.

У этой библиотеки очень большие возможности, больше можно прочесть в официальной документации на сайте Apache, а у меня все.

Исходники: