2013-08-28 115 views
3

我正在使用Apache POI写入Excel文件,但我希望将输出的格式设置为HTML而不是文本文本。Apache POI - 将格式输出格式设置为HTML

SXSSFWorkbook workbook = new SXSSFWorkbook(); 
Sheet sheet0 = workbook.createSheet("sheet0"); 
Row row0 = sheet0.createRow(2); 
Cell cell0 = row0.createCell(2); 

cell0.setCellValue("<html><b>blah blah blah</b></html>"); 

什么,当我打开Excel文件显示:

"<html><b>blah blah blah</b></html>" 

,但我想:

“等等等等等等”

基本上我找了一块的代码沿线:

cell0.setCellFormat(CellFormat.HTML); 

除此之外不存在。

这里是关于这一主题

http://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/ss/examples/html/ToHtml.java

一些信息,我会尝试这个现在:

public void printPage() throws IOException { 
    try { 
     ensureOut(); 
     if (completeHTML) { 
      out.format(
        "<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>%n"); 
      out.format("<html>%n"); 
      out.format("<head>%n"); 
      out.format("</head>%n"); 
      out.format("<body>%n"); 
     } 

     print(); 

     if (completeHTML) { 
      out.format("</body>%n"); 
      out.format("</html>%n"); 
     } 
    } finally { 
     if (out != null) 
      out.close(); 
     if (output instanceof Closeable) { 
      Closeable closeable = (Closeable) output; 
      closeable.close(); 
     } 
    } 
} 
+2

POI的例子是关于excel-> HTML,但你要的html - > excel cell ...最近有一个[类似的请求](http://stackoverflow.com/questions/17800017/writing-styled-text-to-a-docx-file/17823048#17823048),也许你可以使HTMLEditorKit - > StyledDocument( - > RichTextString)过程适应Excel单元格?! – kiwiwings

回答

4

基于my version for DocX,这里是HSSF改编版本。与其他版本一样,您必须调试并扩展各种CSS样式的循环。

更新:我昨天已经忽略了,你想有一个流XSSF解决方案,所以我摆弄周围,如果有可能,只是使用的usermodel类(不是真的,当涉及到字体颜色),而且我不知道为什么SXSSF没有使用任何我的字体设置,直到我发现,通过设计的目前(见错误52484

import java.awt.Color; 
import java.io.FileOutputStream; 
import java.lang.reflect.Field; 
import java.util.Enumeration; 
import javax.swing.text.*; 
import javax.swing.text.html.*; 
import org.apache.poi.hssf.usermodel.*; 
import org.apache.poi.hssf.util.HSSFColor; 
import org.apache.poi.ss.usermodel.*; 
import org.apache.poi.xssf.usermodel.*; 

public class StyledTextXls { 
    public static void main(String[] args) throws Exception { 
     HTMLEditorKit kit = new HTMLEditorKit(); 
     HTMLDocument doc = (HTMLDocument)kit.createDefaultDocument(); 
     kit.insertHTML(doc, doc.getLength(), "<p>paragraph <b>1</b></p>", 0, 0, null); 
     kit.insertHTML(doc, doc.getLength(), "<p>paragraph <span style=\"color:red\">2</span></p>", 0, 0, null); 

     Workbook wb = new XSSFWorkbook(); 
//  Workbook wb = new HSSFWorkbook(); 
//  Workbook wb = new SXSSFWorkbook(100); // doesn't work yet - see Bug 52484 
     Sheet sheet = wb.createSheet(); 
     Row row = sheet.createRow(0); 
     Cell cell = row.createCell(0); 

     StringBuffer sb = new StringBuffer(); 
     for (int lines=0, lastPos=-1; lastPos < doc.getLength(); lines++) { 
      if (lines > 0) sb.append("\n"); 
      Element line = doc.getParagraphElement(lastPos+1); 
      lastPos = line.getEndOffset(); 
      for (int elIdx=0; elIdx < line.getElementCount(); elIdx++) { 
       final Element frag = line.getElement(elIdx); 
       String subtext = doc.getText(frag.getStartOffset(), frag.getEndOffset()-frag.getStartOffset()); 
       sb.append(subtext); 
      }   
     } 

     CreationHelper ch = wb.getCreationHelper(); 
     RichTextString rt = ch.createRichTextString(sb.toString()); 
     for (int lines=0, lastPos=-1; lastPos < doc.getLength(); lines++) { 
      Element line = doc.getParagraphElement(lastPos+1); 
      lastPos = line.getEndOffset(); 
      for (int elIdx=0; elIdx < line.getElementCount(); elIdx++) { 
       final Element frag = line.getElement(elIdx); 
       Font font = getFontFromFragment(wb, frag); 
       rt.applyFont(frag.getStartOffset()+lines, frag.getEndOffset()+lines, font); 

      }   
     }  

     cell.setCellValue(rt); 
     cell.getCellStyle().setWrapText(true); 
     row.setHeightInPoints((6*sheet.getDefaultRowHeightInPoints())); 
     sheet.autoSizeColumn((short)0); 

     FileOutputStream fos = new FileOutputStream("richtext"+(wb instanceof HSSFWorkbook ? ".xls" : ".xlsx")); 
     wb.write(fos); 
     fos.close(); 
    } 

    static Font getFontFromFragment(Workbook wb, Element frag) { 
     // creating a font on each is call is not very efficient 
     // but should be ok for this exercise ... 
     Font font = wb.createFont(); 

     final AttributeSet as = frag.getAttributes(); 
     final Enumeration<?> ae = as.getAttributeNames(); 

     while (ae.hasMoreElements()) { 
      final Object attrib = ae.nextElement(); 

      try { 
       if (CSS.Attribute.COLOR.equals(attrib)) { 
        // I don't know how to really work with the CSS-swing class ... 
        Field f = as.getAttribute(attrib).getClass().getDeclaredField("c"); 
        f.setAccessible(true); 
        Color c = (Color)f.get(as.getAttribute(attrib)); 
        if (font instanceof XSSFFont) { 
         ((XSSFFont)font).setColor(new XSSFColor(c)); 
        } else if (font instanceof HSSFFont && wb instanceof HSSFWorkbook) { 
         HSSFPalette pal = ((HSSFWorkbook)wb).getCustomPalette(); 
         HSSFColor col = pal.findSimilarColor(c.getRed(), c.getGreen(), c.getBlue()); 
         ((HSSFFont)font).setColor(col.getIndex()); 
        } 
       } else if (CSS.Attribute.FONT_WEIGHT.equals(attrib)) { 
        if ("bold".equals(as.getAttribute(attrib).toString())) { 
         font.setBoldweight(Font.BOLDWEIGHT_BOLD); 
        } 
       } 
      } catch (Exception e) { 
       System.out.println(attrib.getClass().getCanonicalName()+" can't be handled."); 
      } 
     }    

     return font; 
    } 
} 
+2

@Alex Mills:我已经更新了我的版本 - 简而言之,它目前(含POI-3.10-beta1)无法在SXSSF中使用RichTextStrings – kiwiwings