SolveItproblems

SolveITProblems is a project of QFormat.net intellectual club

SolveITProblems это проект интеллектуального клуба QFormat.net

вторник, 9 февраля 2010 г.

Java + Excel

Мне несколько раз приходилось писать программы которые должны генерировать Еxcell рапорты. Использовал разные библиотеки, но в последний раз выходной файл должен был быть на Excell 2007. В нете есть так платные так и бесплатные библиотеки. Платные я не трогал а из бесплатных перепроверил все что нашел их было 3-4. Идеально подошла баблиотека Smart XLS http://www.smartxls.com/ но сволочь платная хотя разобраться в нем очень легко и пользоваться тоже. Если у вас есть возможность заставить руководство оплатить лицензию на нее которая стоит для разработчика 199$. Маленько дороговато но это вещь работает со всеми версиями excell файлов. Когда вы скачиваете jar бибилотеку вы скачиваете так же семплы для понимания того, как работать с библиотекой. Коротко скажу как работать с библиотекой:
  1. скачиваете библиотеку
  2. прикрепляете ее к проекту (в зависимости от IDE который вы используете это по разному но шаги похожие - находите Library и делаете Add jar)
  3. в классе пишите примерно следующее:


import com.smartxls.WorkBook;


public class test {

public static void main(String args[])
{
WorkBook bookRead = new WorkBook();
WorkBook bookWrite = new WorkBook();
try
{
bookRead.readXLSX("D:\\My Documents\\ICL\\Project NWSSP\\database.xlsx");
bookRead.setSheet(1);
System.out.println(bookRead.getNumber(0, 0));
bookRead.readXLSX("D:\\My Documents\\ICL\\Project NWSSP\\database.xlsx");
}
catch (Exception e)
{
e.printStackTrace();
}
}
}

Если же вы как истинный девелопер плюете на все платное для разработки, то подходит библиотека Apache POI http://poi.apache.org/. Она бесплатна, так же работает со всеми версиями ексела, нужно только потратить немного больше времени на освоение. Нужным следует здесь указать несколько моментов, после того как скачали архив, к своему проекту подключаем poi-3.6-20091214.jar (название файла меняется в зависимости от версии и даты релиза как вы поняли), этого достаточно чтобы создавать свои воркбуки. Если же хотим читать готовый хлс(хлсх), то нужно подключить еще несколько джаров. Это чуть ли не взбесило меня когда я читал хлсх, поиски в гугле ничего не давали - семплы не работали. В конце концов интуитивное понимание проблемы и вытекающее из этого подключение джаров решило проблему. Пришлось подключить следующие джары:

poi-ooxml-3.6-20091214.jar .
\ooxml-lib\dom4j-1.6.1.jar
\ooxml-lib\xmlbeans-2.3.0.jar
\lib\log4j-1.2.13.jar
poi-contrib-3.6-20091214.jar
poi-ooxml-schemas-3.6-20091214.jar

и вот вам маленький пример создания и чтения хлсов.

import java.io.*;
import org.apache.poi.*;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.*;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CreationHelper;
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 org.apache.poi.xssf.eventusermodel.XSSFReader;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class test {

public static void main(String args[])
{

try
{

//creating xls
Workbook bookRead = new HSSFWorkbook();
CreationHelper createHelper = bookRead.getCreationHelper();
Sheet s = bookRead.createSheet("s");
Row r = s.createRow((short)5);
Cell c = r.createCell(6);
c.setCellValue(5);
FileOutputStream fileOut = new FileOutputStream("c:\\workbook.xls");
bookRead.write(fileOut);
fileOut.close();

//reading xls
InputStream inp = new FileInputStream("c:\\workbook.xls");
Workbook wb = WorkbookFactory.create(inp);
Sheet sheet = wb.getSheetAt(0);
Row row = sheet.getRow(2);
if (row==null)
{
row = sheet.createRow(2);
}
Cell cell = row.getCell(3);
if (cell == null)
cell = row.createCell(3);
cell.setCellType(Cell.CELL_TYPE_STRING);
cell.setCellValue("a test");
FileOutputStream fos = new FileOutputStream("c:\\workbook.xls");
wb.write(fos);
fos.close();
//reading xlsx
InputStream inp1 = new FileInputStream("c:\\2007.xlsx");
Workbook wb1 = WorkbookFactory.create(inp1);
Sheet sheet1 = wb1.getSheetAt(0);
Row row1 = sheet1.getRow(2);
if (row1==null)
{
row1 = sheet1.createRow(2);
}
Cell cell1 = row1.getCell(3);
if (cell1 == null)
cell1 = row1.createCell(3);
cell1.setCellType(Cell.CELL_TYPE_STRING);
cell1.setCellValue("a test");
FileOutputStream fos1 = new FileOutputStream("c:\\2007.xlsx");
wb1.write(fos1);
fos1.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}





Удачи :)

6 комментариев:

  1. Платные я не трогал а из бесплатных перепроверил все что нашел их было 3-4. Идеально подошла баблиотека Smart XLS http://www.smartxls.com/ но сволочь платная хотя

    ОтветитьУдалить
  2. "В конце концов интуитивное понимание проблемы и вытекающее из этого подключение джаров решило проблему." автор не слышал о maven?

    ОтветитьУдалить
  3. Но при чем тут maven? Подключение джаров в современных IDE с помощью кликов и в случае maven и в случае IDE native делается с помощью кликов, если конечно прогер не любитель геморного кодописания для подключения локальных библиотек.

    ОтветитьУдалить
  4. спасибо за статью..

    ОтветитьУдалить
  5. Я купил СмартХЛС, т.к. когда в отладчике выдало "истек 30-дневный бесплатный срок", было уже слишком поздно переделывать проект.

    из плюсов - поддерживает графики, очень простой

    из минусов (сейчас переписываюсь с китайцами по этому поводу) --- нереально создать большой Экселевский файл (у меня получаются по 170 метров), не хватает памяти.... Наверно, нет кеширования на диск, все держит в памяти...

    ОтветитьУдалить