NPOIã調ã¹ãŠããã®ã«Apache POIã§xlsx圢åŒãã¡ã€ã«ãã€ãããªããŠæ©ãã ä»¶
å æ¥ãããçã®ãããã§NPOIãåŒãç¶ã調ã¹ãŠããŸããããApache POIãç§»æ€ãããã®ãNPOIãªãã ã£ãããæ¬å®¶POIã§ããã£ãŠã¿ããããšæãç«ã£ãŠåããããªã³ãŒããæžããã®ã§ãã⊠ããã£ãŠããŸããŸããã
ã§ãã倧äžå€«ããšããããæ¬å®¶POIã®ã»ãã¯äžæšæ¥è§£æ±ºããã®ã§èŠããŠãããã¡ã«ãšã³ããªãŒããŸãã
Apache POIã§xlsxãäœãããšãã§ããªã
Javaã¯é¢åã«æããŠããŸãã®ã§ãPowerShellãšåãæèŠã§groovyã§æžãå§ããŸããã
@Grab("org.apache.poi:poi-ooxml:3.+") import org.apache.poi.xssf.usermodel.* import org.apache.poi.ss.usermodel.* xls = new XSSFWorkbook() ws = xls.createSheet("hello") r = ws.createRow(0) c = r.createCell(0) c.setCellValue("hello") new File("hello.xlsx").withOutputStream{ xls.write(it) }
ãããNPOIã®ãšããšã ãããåãã§ããã ãããããããããŸããããŸããã
Caught: java.lang.NoClassDefFoundError: org/openxmlformats/schemas/spreadsheetml/x2006/main/CTExtensionList java.lang.NoClassDefFoundError: org/openxmlformats/schemas/spreadsheetml/x2006/main/CTExtensionList at excel.run(excel.groovy:9) Caused by: java.lang.ClassNotFoundException: org.openxmlformats.schemas.spreadsheetml.x2006.main.CTExtensionList ... 1 more
ã¯ã©ã¹ãèŠã€ãããªãïŒãšããããšã§èª¿ã¹å§ããŸããã
ããã£ãŠããŸã£ãæ ¹æ¬çãªåå
ã°ã°ã£ãŠãããšãApache POIæ¬å®¶ã®FAQãµã€ãã«ãã©ãçããŸããã
Frequently Asked Questions http://poi.apache.org/faq.html
ããããã¡ããšèªãŸãªãã£ãããšãä»åããã£ãŠããŸã£ãæ ¹æ¬çãªåå ã ã£ãã®ã§ãããNoClassDefFoundErrorã§ããŒãžå æ€çŽ¢ãããŠããŸã£ãã®ã§ãFAQã®18çªãèªãã§ããŸã£ãã®ã§ãã ããšããããããèãããå šç¶é¢ä¿ãªãã£ãã®ã§ããã
18.Why do I get a java.lang.NoClassDefFoundError: javax/xml/stream/XMLEventFactory.newFactory()
http://poi.apache.org/faq.html#faq-N1017E
ããã§ã¯å€ãjarãèªã¿èŸŒãã§ããŸã£ãŠããã®ã§ããšãããããªããšãèšèŒããŠãã£ãŠã§ããã ããããé€å€ããã°ããã®ãããšåéãããŠããŸã£ãã®ã§ãã ãããŠå ã»ã©ã®ã³ãŒãã«@GrabExclude()ãèšè¿°ããŠããŸãããããªïŒãšãã£ãŠã¿ãŠããŸã£ãã®ã§ãã
ãã¡ãããç¡é¢ä¿ãªã®ã§ãŸã£ããçµæã¯å€ãããŸããããããŒã£ãšãªã£ãŠããŸããŸããã
Apache POIãèªã
ãªãŒãã³ãœãŒã¹ãªã®ã§ãœãŒã¹ã³ãŒãã¯ããŠã³ããŒãããŠããããšãã§ããŸãã ã ãããã£ãããªã®ã§ãæ¬åœã«ãã®ã¯ã©ã¹ããªãã®ãã¿ãŠã¿ããããšããããšã§ããã«èª¿ã¹å§ããŸããã ãããããšãä»ã«ãjarãããããšã«æ°ã¥ããŸããã
ã©ãããxlsx圢åŒã®ãšãã¯ãpoi-ooxml-schema.jarããšããã®ãå¿ èŠãªãããªã®ã§ãã ããã§ããœãŒã¹ã³ãŒããèªãåã«@Grab("org.apache.poi:poi-ooxml-schema:3.+")ãšããã®ã远èšããŸããã ããã§ããŸãããããšæãããããããŸããšã©ãŒã«ãªããŸããã
ããã§ãä»åºŠãããã®ãpoi-ooxml-schemaãã®äžèº«ãã¿ãŠã¿ãããªã£ãŠãœãŒã¹ã³ãŒããã¿ãŠã¿ãããšã«ããŸããã
ãšã©ãŒã«ãªã£ãŠããç®æããããããããšãsetCellValueã¡ãœããã§ããããããã¿ãŠããããšã«ããŸããã
ããŠã³ããŒãããŠããã®ã¯3.13-betaã§ãããããè§£åããŠã¿ããšãsrcã®äžã«ooxmlãšãããã®ããã£ãã®ã§ãããã§ãããã
ãorg/apache/poi/xssf/usermodel/XSSFCell.javaãã該åœãããœãŒã¹ã§ãã ä»åã¯"hello"ãšæååãæž¡ããŠããã®ã§ãããã€ãããã¡ãœããã®ãªãŒããŒã©ã€ãã®ãã¡ãæååãåŒæ°ã«åããã®ã該åœã®ã¡ãœããã§ããã330è¡ç®ã§ãã
@Override public void setCellValue(String str) { setCellValue(str == null ? null : new XSSFRichTextString(str)); }
ãããã¿ããšãã©ããããXSSFRichTextStringããšããã¯ã©ã¹ã«äžããããæååãæž¡ããŠã€ã³ã¹ã¿ã³ã¹åããããšããŠããŸããã§ã¯ãã¡ãã調ã¹ãŠã¿ãããšã«ããŸãã
ãã¡ãã該åœã®ã³ã³ã¹ãã©ã¯ã¿ã¯89è¡ç®ã§ããã
public XSSFRichTextString(String str) { st = CTRst.Factory.newInstance(); st.setT(str); preserveSpaces(st.xgetT()); }
ããã§ã¯ããã«ãCTRstãã¯ã©ã¹ã®Factoryã䜿ã£ãŠæ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããããšããŠããŸãã ã¯ã©ã¹åã®å é ããCTãã§å§ãŸã£ãŠããã®ã§ããªããšãªãäŸã®ãšã©ãŒã«ãã£ããCTExtensionListãã«è¿ã¥ããŠããé°å²æ°ããããŸãã
ã§ã¯ããã®ãCTRstãã¯ã©ã¹ãèŠãŠã¿ãŸãããã
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRst;
importããã¯ã©ã¹ãããã£ãã®ã§ããã®ãœãŒã¹ãæ¢ããŠã¿ãããšã«ããŸããããããã®ãœãŒã¹ã¯Apach POIã®tar ballã«ã¯å«ãŸããŠããªãããã§ããã
è¡ãè©°ãŸã£ãŠããŸã£ãã®ã§ãä»åºŠã¯GrabãããŠã³ããŒãããŠããŠããjarãã¡ã€ã«ããæ¢ãããšã«ããŸããã
jarãã¡ã€ã«ãã調ã¹ã
ãããŸã§ã§ãCTãã§å§ãŸãã¯ã©ã¹ãããªãããã®ã€ã³ã¹ã¿ã³ã¹ãçæãããšãã«ãšã©ãŒã®åå ã«ãªã£ãŠãããCTExtensionListããèŠã€ãããªãã®ã ããããšãããšãããŸã§æšæž¬ã¯ã€ããŸããã
ãšããããã§ãGrabãããŠã³ããŒãããŠããŠããjarãçŽæ¥èŠãŠã¿ãããšã«ããŸããã
ã~/.groovy/grapes/org.apache.poi/poi-ooxml-schemas/jarsãã«ããŠã³ããŒããããŠãããpoi-ooxml-schemas-3.12.jarããè§£åããŠäžèº«ãèŠãŠãããŸãã
unzip poi-ooxml-schemas-3.12.jar
ãããããšãè§£åãããŠããäžãããorg/openxmlformats/schemas/spreadsheetml/x2006/mainãããããŸããããã®äžã«ãCTExtensionListããååšããªããã°ã¢ãŠãã§ãã
èŠãŠã¿ããšãååšããŸããã
ãªãã»ã©ãããããšã©ãŒã«ãªããŸãããããœãŒã¹ãã¿ããŸã§ããªãã£ããããããŸããã§ããã
CTExtensionListã¯ã©ãã«ãã
ããã§ãäžçªæåã®FAQã«æ»ã£ãŠã¿ãããšã«ããŸãããåé ã«FAQã®ãªã¹ããããã®ã§çºããŠãããšãæªãããã®ãããã«ãããŸãããã©ãããŠèŠèœãšãããã§ãããâŠ
3.I'm using the poi-ooxml-schemas jar, but my code is failing with "java.lang.NoClassDefFoundError: org/openxmlformats/schemas/something" http://poi.apache.org/faq.html#faq-N10025
ã»ããšã«äœæ ãããªããã®ãŸããŸããªãã®ãèŠèœãšããŠããã®ã§ãããïŒ ãpoi-ooxml-schemasã䜿ã£ãŠããã©ãorg/openxmlformats/schemas/ã®äœããèŠã€ãããªããŠå€±æãããã§ãã£ãŠãæ²ããã
å 容ãç°¡åã«ãããšã以äžã®ãšãã
POIã§ooxmlãã¡ã€ã«åœ¢åŒã®ãã®ãæ±ãã«ã¯XSDãšãããã¡ã€ã«åœ¢åŒãå«ãŸããjarãå¿ èŠ
ãã®jarã«ã¯ãµã€ãºã®å€§ãããã®ãšå°ãããŸãšãããã®ã®ïŒçš®é¡ãã
ä»åã®çšéã«å¿ èŠãªã®ã¯ãµã€ãºã®å€§ãããooxml-schemas-1.1.jarããšãããã€
ãšããããšã§ãã³ãŒããå°ãã ãæžãçŽããŸããã
@Grapes([ @Grab("org.apache.poi:poi-ooxml:3.+"), @Grab("org.apache.poi:ooxml-schemas:1.1") ]) import org.apache.poi.xssf.usermodel.* import org.apache.poi.ss.usermodel.* xls = new XSSFWorkbook() ws = xls.createSheet("hello") r = ws.createRow(0) c = r.createCell(0) c.setCellValue("hello") new File("hello.xlsx").withOutputStream{ xls.write(it) }
ããã ãã§ããšã©ãŒãªãxlsxãã¡ã€ã«ãäœæã§ããŸããã ããã£ãŠããŸãã°ãããèŠçŽ ã¯çç¡ã§ããâŠ
Apache POIã調ã¹ãçµæwwwwwww
NPOIã§äœæããxlsxãã¡ã€ã«ãNumbersã§éãããšãã§ããªãä»¶ã調æ»ããŠããã®ã«è±ç·ããäžã«å€§å¹ ã«ããã£ãŠããŸããŸããã ããããããããŠApache POIããçæã§ããxlsxãã¡ã€ã«ã¯Numbersã§ãéãããšãã§ããŸããã
ãã¯ãæ²ãããšããããã¢ã¬ã§ããã
ãšããããšã§ãNPOIã®ã»ãã¯ããå°ãç¶ãããã§ãã













