Database
 sql >> база данни >  >> RDS >> Database

Как да създадете документ на Excel от програма на Java с помощта на Apache POI

POI на Apache е популярна библиотека с отворен код, използвана за четене, писане и манипулиране на файлове на MS Office и Open Office чрез използване на Java код. Библиотеката е един от многото продукти с отворен код, поддържани от Apache Software Foundation (ASF) допринесе за общността на Java. Библиотеката съдържа класове и методи за декодиране на файлови формати, базирани на Open Office XML стандарти и Microsoft OLE2. Въпреки че библиотеката е в състояние да манипулира файловете на Word, Excel и PowerPoint, тази статия се фокусира главно върху документи с електронни таблици, само за да бъде кратка.

Научете JAVA и започнете своя безплатен пробен период днес!

Библиотеката на Apache POI

Интригуващо е, че в името на Apache POI, POI означава „лошо внедряване на обфускация“ и целта на библиотеката е да предостави Java API за манипулиране на различни файлови формати, базирани на стандартите Office Open XML (OOXML) и формата на Microsoft OLE 2 Compound Document (OLE2). Накратко, това позволява на човек да чете и пише файлове на MS Excel, MS Word и MS PowerPoint с помощта на Java код. Повечето файлове на Microsoft Office – като XLS, DOC, PPT и MFC базирани на API файлови формати за сериализация – са базирани на стандарта OLE2. По принцип OLE е собствена техника, разработена от Microsoft и предоставя формата за свързване на обекти и вграждане на обекти в контейнерни документи. Първият формат се нарича формат OLE1.0, където свързаният обект и данните за вградения обект са изложени като последователност от байтове в документа на контейнера. Втората версия, форматът OLE2.0, използва технологията на OLE Compound File (MS-CFB), където данните за свързания обект или вградените обекти се съдържат в това хранилище под формата на обекти на OLE Compound File Stream. Вижте OLE1.0 и OLE2.0 формати за повече подробности относно това. Библиотеката POI на Apache предоставя библиотечни API за файловата система OLE2, наречена POIFS и OLE2 Document Properties, наречена HPSF.

Компоненти на Apache POI

Библиотеката POI Apache предоставя класове и методи за работа с OLE2 Compound Documents на MS Office. Ето кратък преглед на най-често използваните:

  • POIFS за OLE2 Documents:POIFS означава Loor Obfuscation Implementation File System . Това е основният POI елемент, реализиран в библиотеката към порта на OLE2 Compound Document. Той поддържа функционалност за четене и запис за двоичния формат на Microsoft Office, който не е XML. Всички API на POI библиотеката са изградени върху това.
  • HSSF и XSSF:HSSF означава Ужасен формат на електронна таблица . Това е порт за реализация на Java за файловия формат на Excel 97 или за .xls файлове. XSSF означава XML Spread Sheet Format и това е порт за файловия формат OOXML или файловия формат .xlsx.
  • HWPF и XWPF:HWPF означава Ужасен формат на текстовия процесор . Това е ограничен порт само за четене за по-стария файлов формат на Word 6 или Word 95. XWPF означава XML Word Processor Format . Това е порт за реализация на Java за файловия формат .docx на Word 2007. И двете реализации поддържат ограничена функционалност.
  • HSLF и XSLF:HSLF означава Ужасен формат на оформлението на слайд . XSLF означава XML Slide Layout Format . И двете предоставят възможност за четене, писане, създаване и модифициране на презентации на PowerPoint, докато HSLF поддържа формата PowerPoint 97, а XSLF поддържа по-късни версии.
  • HPSF :HPSF е съкращение от Ужасен формат на набор от имоти . Той се използва особено за работа със свойства на документа, като например задаване на заглавие, категория, автор, дата на модификация и така нататък на документ
  • HDGF и XDGF:HDGF означава Ужасен формат на диаграма . Този компонент съдържа класове за работа с двоичния файлов формат на Visio. Той предоставя API на ниско ниво, само за четене за достъп до документи на Visio и VSD файлове. XDGF означава XML Diagram Format . Той е за файловия формат Visio XML или VSDX файлове.
  • HPBF :HPBF е съкращение от Ужасен издателски формат . Това е ограничен Java порт за работа с файловия формат MS Publisher.

Акронимите звучат хумористично, защото тези файлови системи трябваше да бъдат затворени и Microsoft направи всичко възможно да замаже кода, така че да бъдат не само трудни за разбиране, но и трудни за обратно инженерство. Но разработчиците от Apache го хакнаха с лекота и успешно го проектираха обратно. Може би в знак на радост или пълно осъждане на затворената система са ги нарекли шеговито като такива.

Работа с HSSF и XSSF файлове

Компонентите HSSF и XSSF на библиотеката Apache предоставят три модела за достъп до документ с електронна таблица съгласно документацията на HSSF и XSSF. Те са:

  • Структури на ниско ниво за специални нужди
  • API на модела на събития за достъп само за четене до документи на Excel
  • API на потребителския модел за създаване, четене и модифициране на файлове на Excel

Ограничените API на модела на събития могат да се използват само за четене на данни от електронни таблици. Тези API се намират в org.apache.poi.hssf.eventusermodel пакет и org.apache.poi.xssf.eventusermodel пакет, където първият се използва за четене на данни от .xls файлов формат, а вторият се използва за четене на данни от .xlsx файлов формат.

Потребителският модел е много по-гъвкав и по-лесен за използване; може да чете, пише, създава и променя документ с електронна таблица на Excel. Но той има много по-голям отпечатък на паметта от модела на събития от ниско ниво.

Освен това, достъпът и манипулирането на по-новия, базиран на OOXML файлов формат с XSSF, има много по-голям отпечатък на паметта от старите поддържани от HSSF двоични файлове.

От POI 3.5 нататък, моделът HSSF и XSSF беше включен в модела SS, по-скоро коригиран, за да работи и за двата модела. Това е по-скоро промяна на името, отколкото реална промяна. В известен смисъл можем да кажем, че SS=HSSF+XSSF.

Мигриране на данни от таблицата на базата данни към електронна таблица на Excel

Тук ще създадем проста помощна програма за мигриране на някои данни от базата данни в лист на Excel. Това също може да бъде настроено за работа с други начини, като например мигриране на данни от Excel към таблица на база данни. Това е оставено като упражнение за читателя. Програмата е проста и разбираема. Посетете Apache POI Documentation за подробна информация относно всички класове или методи. За да опитаме следния пример, използвахме следното:

  • JDK 8
  • MS Excel 2007
  • Intellij IDEA IDE
  • Apache POI 3.17
  • Apache Derby 10.14

Посетете съответните документи и помощни файлове за настройка на проекта. Ето съдържанието на файла Maven pom.xml, който използвахме.

<проект xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org /xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0modelVersion> <groupId>com.mano.examplesgroupId> <artifactId>apache-poi-demoartifactId> <версия>1.0-SSNAPSHOTверсия> <опаковане>бурканопаковката> <име>apache-poi-demoname> <url>http://maven.apache.orgurl> <свойства> <project.build.sourceEncoding> UTF-8 project.build.sourceEncoding> свойства> <изграждане> <приставки> <приставка> <artifactId> maven-compiler-plugin artifactId> <версия>3.7.0версията> <конфигурация> <източник>1.8източник> <цел>1.8цела> конфигурация> приставка> приставки> изграждане> <зависимости> <зависимост> <groupId>junitgroupId> <artifactId>junitartifactId> <версия>3.8.1версията> <обхват>тестобхвата> зависимост>  <зависимост> <groupId>org.apache.maven.pluginsgroupId> <artifactId>maven-compiler-pluginartifactId> <версия>3.7.0версията> зависимост>  <зависимост> <groupId>org.apache.poigroupId> <artifactId>poiartifactId> <версия>3.17версията> зависимост>  <зависимост> <groupId>org.apache.poigroupId> <artifactId>poi-ooxmlartifactId> <версия>3.17версията> зависимост>  <зависимост> <groupId>org.apache.derbygroupId> <artifactId>дербиartifactId> <версия>10.14.1.0версия> <обхват>тестобхвата> зависимост>  <зависимост> <groupId>org.apache.derbygroupId> <artifactId>derbyclientartifactId> <версия>10.14.1.0версия> зависимост> зависимости>проект> 

Обява 1: pom.xml

Създава се таблица на база данни с някои фиктивни записи преди стартиране на помощната програма. Ето кода на този файл.

пакет com.mano.examples;внос java.sql.*;public class DummyDatabase {public static void createDummyDatabase() хвърля SQLException { Connection con=DriverManager.getConnection ("jdbc:derby:D:/temp/dummy;create=true" ); Изявление stmt=con.createStatement(); stmt.executeUpdate("изпускане на таблица семестър 2" ); stmt.executeUpdate("СЪЗДАВАНЕ НА ТАБЛИЦА семестър 2(STUDENT_ID int, CARCH INT, DCE INT, WEBTECH INT, JAVA INT, SAD_MIS INT, ОСНОВЕН КЛЮЧ(STUDENT_ID))" ); // Вмъкване на 2 реда stmt.executeUpdate("вмъкване в семестър 2 стойности (23567932,56,78,97,58,85)" ); stmt.executeUpdate("вмъкване в семестър 2 стойности (47250001,96,34,75,68,12)" ); stmt.executeUpdate("вмъкване в семестър 2 стойности (99568955,45,68,69,78,29)" ); stmt.executeUpdate("вмъкване в семестър 2 стойности (89376473,75,23,56,89,47)" ); stmt.executeUpdate("вмъкване в семестър 2 стойности (29917740,85,78,55,15,48)" ); stmt.executeUpdate("вмъкване в семестър 2 стойности (85776649,23,56,78,25,69)" ); stmt.executeUpdate("вмъкване в семестър 2 стойности (38846455,68,95,78,53,48)" ); stmt.executeUpdate("вмъкване в семестър 2 стойности (40028826,63,56,48,59,75)" ); stmt.executeUpdate("вмъкване в семестър 2 стойности (83947759,85,54,69,36,89)" ); stmt.executeUpdate("вмъкване в семестър 2 стойности (92884775,78,59,25,48,69)" ); stmt.executeUpdate("вмъкване в семестър 2 стойности (24947389,12,10,14,54,68)" ); stmt.executeUpdate("вмъкване в семестър 2 стойности (77399465,44,33,26,88,77)" ); // Заявка ResultSet rs =stmt.executeQuery ("SELECT * FROM semester2" ); // Отпечатайте резултата от заявката докато (rs.next()) { System.out  .printf ("%dt%dt%dt%dt%dt%dn" , rs.getLong("STUDENT_ID" ), rs.getInt("CARCH" ), rs.getInt("DCE" ), rs.getInt("WEBTECH" ), rs.getInt("JAVA" ), rs.getInt("SAD_MIS" )); } stmt.close(); con.close(); }}

Списък 2: DummyDatabase.java.

Това е помощната програма, за която говорим. Кодът беше написан набързо и структурата не беше много елегантна. Въпреки това работи. Преструктурирайте го или го оправете, както сметнете за добре.

пакет com.mano.examples;внос org.apache.poi.hssf.usermodel.HSSFWorkbook;импорт org.apache.poi.ss.usermodel.*;импорт org.apache.poi.xssf.usermodel.XSSFWorkbook;импорт java.io.File;импорт java.io.FileOutputStream;импорт java.io.IOException;импорт java.sql.*;публичен клас  SSF File {частен статичен  Низ[] заглавка ={"STUDENT_ID" , "CARCH" , „DCE“ , "WEBTECH" , „JAVA“ , "SAD_MIS" , „ОБЩО“ , "СРЕДНО" }; обществена статична празнота  databaseToExcel(файлов файл) изхвърля IOException, SQLException { Workbook workbook =null; ако (file.getName().endsWith(.xls"). )) работна книга =нова HSSF Workbook(); иначе ако (file.getName().endsWith(.xlsx"). )) работна книга =нова XSSFWorkbook(); друго { System.out  .println(„Невалидно име на файл!“ ); връщане; } Лист лист =workbook.createSheet(); Connection con =DriverManager.getConnection ("jdbc:derby:D:/temp/dummy;create=true" ); Изявление stmt =con.createStatement(); ResultSet rs =stmt.executeQuery("SELECT * FROM semester2" ); Ред rr =sheet.createRow(0); за (int  i=0;i<заглавка .дължината;i++){ createHeaderCell (rr, (кратко ) i, заглавка [i]); } int i =1; докато (rs.next()) { rr =sheet.createRow(i++); за (int  j=0;j<заглавка .дължината -2;j++){ createDataCell (rr, (кратко ) j, rs.getLong(заглавка [j])); } } rr =лист.getRow(1); Общо клетки =rr.createCell(6); total.setCellType(CellType.FORMULA  ); total.setCellFormula("SUM(B2:F2)"). ); Cell avg =rr.createCell(7); avg.setCellType(CellType.FORMULA  ); avg.setCellFormula("СРЕДНО(B2:F2)" ); FileOutputStream outFile =нов FileOutputStream(файл); работна книга.write(outFile); outFile.flush(); outFile.close(); stmt.close(); con.close(); } частна статична празнота createHeaderCell(ред ред, кратък col, String cellValue) { Cell c =row.createCell(col); c.setCellValue(cellValue); } частна статична празнота createDataCell(ред ред, кратък col, Number cellValue) { Cell c =row.createCell(col); c.setCellType(CellType.NUMERIC  ); c.setCellValue(cellValue.doubleValue()); }}

Списък 3: SSFile.java

Това е контролният панел, от който се извиква помощната програма.

пакет com.mano.examples;внос java.io.File;импорт java.io.IOException;импорт java.sql.SQLException;публичен клас Приложение{публична статична празнота main( String[] args ) хвърля IOException,SQLException{ // DummyDatabase.createDummyDatabase(); SSFFile.databaseToExcel (нов Файл ("d://temp//test1.xls" )); }}

Обява 4 :App.java

Преди да стартирате...

Уверете се, че test1.xls или test1.xlsx файловете не съществуват в d://temp директория преди стартиране на програмата, тъй като програмата нито презаписва, нито проверява файла със същото име в директорията, където се предполага, че файлът трябва да бъде създаден. Уверете се в това всеки път, когато програмата се стартира; в противен случай кодът дава неприятно съобщение за грешка. Въпреки това, можете да промените кода, за да поставите малко проверка.

Заключение

Има и друга алтернатива на работата с електронни таблици, както предполага документацията на Apache POI чрез сериализатора Cocoon, въпреки че все още използва HSSF индиректно. Cocoon може да сериализира всеки източник на XML данни чрез прилагане на стиловата таблица и определяне на сериализатора. Моделът HSSF и XSSF е доста мощен и предоставя редица класове и методи за справяне с различни аспекти на документ на Excel. Тази статия се опита да даде представа какво можем да правим с Apache POI. Често се налага да напишем помощна програма за свързване между отворена и затворена система. Apache POI определено може да служи на нашата цел като единствен по рода си.

Препратки

  • Apache POI – API на Java за Microsoft Documents
  • POI-HSSF и POI-XSSF – Java API за достъп до файлове във формат Microsoft Excel

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Сравняване на SQL, конструктори на заявки и ORM

  2. Брой прочетени редове / действителни предупреждения за четене на редове в Plan Explorer

  3. Свързване на .NET на Linux към ODBC източник на данни

  4. Нови стандартни размери на базата данни на Azure SQL

  5. Форматиране на данни в Power BI Desktop Visualizations