我需要在Java应用程序中读取Excel 2007 XLSX文件.有谁知道一个很好的API来完成这项任务?
Apache POI 3.5增加了对所有OOXML(docx,xlsx等)的支持
请参阅XSSF子项目
我不得不在.NET中这样做,我找不到任何API.我的解决方案是解压缩.xlsx,然后直接进入操作XML.一旦你创建了辅助类等,它就没那么糟糕了.
有一些"陷阱",像节点都必须按照excel期望的方式排序,我没有在官方文档中找到.Excel有自己的日期时间戳,因此您需要制作转换公式.
AFAIK还没有xlsx库.但是有些旧的xls:
一个库是jxls,它在内部使用已经提到的POI.
2其他链接:处理Excel文件,Java库以读取和写入Excel XLS文档文件.
可能会有点晚,但beta POI现在支持xlsx.
试试这个:
解压缩XLSX文件
读取XML文件
撰写和使用数据
示例代码:
public Workbook getTemplateData(String xlsxFile) { Workbook workbook = new Workbook(); parseSharedStrings(xlsxFile); parseWorkesheet(xlsxFile, workbook); parseComments(xlsxFile, workbook); for (Worksheet worksheet : workbook.sheets) { worksheet.dimension = manager.getDimension(worksheet); } return workbook; } private void parseComments(String tmpFile, Workbook workbook) { try { FileInputStream fin = new FileInputStream(tmpFile); final ZipInputStream zin = new ZipInputStream(fin); InputStream in = getInputStream(zin); while (true) { ZipEntry entry = zin.getNextEntry(); if (entry == null) break; String name = entry.getName(); if (name.endsWith(".xml")) { //$NON-NLS-1$ if (name.contains(COMMENTS)) { parseComments(in, workbook); } } zin.closeEntry(); } in.close(); zin.close(); fin.close(); } catch (FileNotFoundException e) { System.out.println(e); } catch (IOException e) { e.printStackTrace(); } } private void parseComments(InputStream in, Workbook workbook) { try { DefaultHandler handler = getCommentHandler(workbook); SAXParser saxParser = getSAXParser(); saxParser.parse(in, handler); } catch (Exception e) { e.printStackTrace(); } } private DefaultHandler getCommentHandler(Workbook workbook) { final Worksheet ws = workbook.sheets.get(0); return new DefaultHandler() { String lastTag = ""; private Cell ccell; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { lastTag = qName; if (lastTag.equals("comment")) { String cellName = attributes.getValue("ref"); int r = manager.getRowIndex(cellName); int c = manager.getColumnIndex(cellName); Row row = ws.rows.get(r); if (row == null) { row = new Row(); row.index = r; ws.rows.put(r, row); } ccell = row.cells.get(c); if (ccell == null) { ccell = new Cell(); ccell.cellName = cellName; row.cells.put(c, ccell); } } } @Override public void characters(char[] ch, int start, int length) throws SAXException { String val = ""; if (ccell != null && lastTag.equals("t")) { for (int i = start; i < start + length; i++) { val += ch[i]; } if (ccell.comment == null) ccell.comment = val; else { ccell.comment += val; } } } }; } private void parseSharedStrings(String tmpFile) { try { FileInputStream fin = new FileInputStream(tmpFile); final ZipInputStream zin = new ZipInputStream(fin); InputStream in = getInputStream(zin); while (true) { ZipEntry entry = zin.getNextEntry(); if (entry == null) break; String name = entry.getName(); if (name.endsWith(".xml")) { //$NON-NLS-1$ if (name.startsWith(SHARED_STRINGS)) { parseStrings(in); } } zin.closeEntry(); } in.close(); zin.close(); fin.close(); } catch (FileNotFoundException e) { System.out.println(e); } catch (IOException e) { e.printStackTrace(); } } public void parseWorkesheet(String tmpFile, Workbook workbook) { try { FileInputStream fin = new FileInputStream(tmpFile); final ZipInputStream zin = new ZipInputStream(fin); InputStream in = getInputStream(zin); while (true) { ZipEntry entry = zin.getNextEntry(); if (entry == null) break; String name = entry.getName(); if (name.endsWith(".xml")) { //$NON-NLS-1$ if (name.contains("worksheets")) { Worksheet worksheet = new Worksheet(); worksheet.name = name; parseWorksheet(in, worksheet); workbook.sheets.add(worksheet); } } zin.closeEntry(); } in.close(); zin.close(); fin.close(); } catch (FileNotFoundException e) { System.out.println(e); } catch (IOException e) { e.printStackTrace(); } } public void parseWorksheet(InputStream in, Worksheet worksheet) throws IOException { // read sheet1 sharedStrings // styles, strings, formulas ... try { DefaultHandler handler = getDefaultHandler(worksheet); SAXParser saxParser = getSAXParser(); saxParser.parse(in, handler); } catch (SAXException e) { e.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); } }
工作簿类:
public class Workbook { Integer id = null; public Listsheets = new ArrayList ();}
和工作表类:
public class Worksheet { public Integer id = null; public String name = null; public String dimension = null; public Maprows = new TreeMap (); public Map columns = new TreeMap (); public List spans = new ArrayList();}
和Row类:
public class Row { public Integer id = null; public Integer index = null; public Row tmpRow = null; public Style style = null; public Double height = null; public Mapcells = new TreeMap (); public String spans = null; public Integer customHeight = null;}
和Cell类:
public class Cell { public Integer id = null; public Integer rowIndex = null; public Integer colIndex = null; public String cellName = null; public String text = null; public String formula = null; public String comment = null; public Style style = null; public Object value = null; public Cell tmpCell = null;}
和列类:
public class Column { public Integer index = null; public Style style = null; public String width = null; public Column tmpColumn = null; }
和Span类:
public class Span { Integer id = null; String topLeft = null; String bottomRight = null; }