private XSSFRichTextString parseHtmlStrToRichText(String htmlStr) {
Document document = parseHtmlStrToDocument(htmlStr);
XSSFRichTextString rts = parseDocementToRichText(document.getChildNodes().item(0));
return rts;
}
private Document parseHtmlStrToDocument(String content){ content = "<content>" + content + "</content>";
    
     //html的换行标签变为excel的换行
content = content.replaceAll("<br/>", "\n"); DocumentBuilderFactory documentbuilderfactory = DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder;
Document document = null;
try {
documentBuilder = documentbuilderfactory.newDocumentBuilder();
document = documentBuilder.parse(new ByteArrayInputStream(content.getBytes("UTF-8"))); } catch (Exception e) {
e.printStackTrace();
}
return document;
}
private XSSFRichTextString parseDocementToRichText(Node contentNode) {
String wholeTextContent = contentNode.getTextContent();
XSSFRichTextString rts = new XSSFRichTextString(); rts.append(wholeTextContent);
setRichText(rts, contentNode, 0, null);
return rts;
}
private void setRichText(RichTextString rts, Node contentNode, int startIndex, XSSFFont parentFont) {
if (contentNode.getNodeType() == Node.TEXT_NODE) {
return;
} else {
String textContent = contentNode.getTextContent(); XSSFFont font = null;
if (!contentNode.getNodeName().equals("content")) {
font = getRichTextFontOfNode(contentNode, parentFont);
rts.applyFont(startIndex, startIndex + textContent.length(), font);
} NodeList nodeList = contentNode.getChildNodes();
int fontLength = startIndex;
String subTextContent = "";
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
subTextContent = node.getTextContent(); if (node.getNodeType() == Node.TEXT_NODE) {
} else {
setRichText(rts, node, fontLength, font);
}
fontLength += subTextContent.length();
}
} } private XSSFFont getRichTextFontOfNode(Node node, XSSFFont parentFont) { XSSFFont font = new XSSFFont();
font.setFontName(FONT_NAME);
font.setFontHeightInPoints(RICH_FONT_SIZE_DEFAULT);
short fontHeight = RICH_FONT_SIZE_DEFAULT;
if (parentFont != null) {
fontHeight = parentFont.getFontHeightInPoints();
font.setFontHeightInPoints(fontHeight);
font.setColor(parentFont.getXSSFColor());
font.setBold(parentFont.getBold());
font.setUnderline(parentFont.getUnderline());
} if ("span".equals(node.getNodeName())) {
String className = node.getAttributes().getNamedItem("class").getNodeValue();
switch(className) {
case RICH_CSS_01: {
font.setBold(true);
break;
}
case RICH_CSS_02: {
font.setUnderline(XSSFFont.U_SINGLE);
break;
}
case RICH_CSS_03: {
font.setFontHeightInPoints(RICH_FONT_SIZE_3);
font.setBold(true);
break;
}
case RICH_CSS_04: {
int[] rgbColor = P2StringUtil.hexToRgb(RICH_ARGB_BLACK);
XSSFColor xssfColor = new XSSFColor(new java.awt.Color(rgbColor[0], rgbColor[1], rgbColor[2]), new DefaultIndexedColorMap());
font.setColor(xssfColor);
break;
}
case RICH_CSS_05: {
int[] rgbColor = P2StringUtil.hexToRgb(RICH_ARGB_RED);
XSSFColor xssfColor = new XSSFColor(new java.awt.Color(rgbColor[0], rgbColor[1], rgbColor[2]), new DefaultIndexedColorMap());
font.setColor(xssfColor);
break;
}
case RICH_CSS_06: {
int[] rgbColor = P2StringUtil.hexToRgb(RICH_ARGB_BLUE);
XSSFColor xssfColor = new XSSFColor(new java.awt.Color(rgbColor[0], rgbColor[1], rgbColor[2]), new DefaultIndexedColorMap());
font.setColor(xssfColor);
break;
}
}
} else if ("font".equals(node.getNodeName())) {
int fontSize = Integer.parseInt(node.getAttributes().getNamedItem("size").getNodeValue()); switch(fontSize) {
case 1:
fontHeight = RICH_FONT_SIZE_1;
break;
case 2:
fontHeight = RICH_FONT_SIZE_2;
break;
case 3:
fontHeight = RICH_FONT_SIZE_3;
break;
case 4:
fontHeight = RICH_FONT_SIZE_4;
break;
case 5:
fontHeight = RICH_FONT_SIZE_5;
break;
case 6:
fontHeight = RICH_FONT_SIZE_6;
break;
default:
fontHeight = RICH_FONT_SIZE_7;
break;
}
font.setFontHeightInPoints(fontHeight); } return font;
} private String parseRichTextToHtmlStr(XSSFCell cell) {
String htmlStr = ""; String cellType = cell.getCellType().toString();
if (!"STRING".equals(cellType)) {
htmlStr = InstructionUtil.getCellValueByCell(cell);
return htmlStr;
}
XSSFRichTextString rts = cell.getRichStringCellValue();
String wholeContentText = rts.getString();
if (StringUtils.isEmpty(wholeContentText)) {
return wholeContentText;
}
if (rts.numFormattingRuns() == 0) {
XSSFCellStyle cellStyle = cell.getCellStyle();
XSSFFont font = cellStyle.getFont(); htmlStr = parseFontToHtmlStr(font, wholeContentText);
} else {
for(int i=0; i<rts.numFormattingRuns(); i++) {
String subContent = wholeContentText.substring(rts.getIndexOfFormattingRun(i), rts.getIndexOfFormattingRun(i)+rts.getLengthOfFormattingRun(i));
XSSFFont font = rts.getFontAtIndex(rts.getIndexOfFormattingRun(i));
if (!"".equals(subContent)) {
htmlStr += parseFontToHtmlStr(font, subContent);
} }
} return htmlStr;
} private String parseFontToHtmlStr (XSSFFont font, String contentText) {
String htmlStr = "";
StringBuffer sb = new StringBuffer();
XSSFColor color = font.getXSSFColor();
String colorClass = null;
boolean underlined = false;
boolean isBold = font.getBold();
if (color != null && color.getARGBHex() != null) {
switch (color.getARGBHex()) {
case RICH_ARGB_BLACK:
colorClass = RICH_CSS_04;
break;
case RICH_ARGB_RED:
colorClass = RICH_CSS_05;
break;
case RICH_ARGB_BLUE:
colorClass = RICH_CSS_06;
break;
}
}
if (Font.U_SINGLE == font.getUnderline()) {
underlined = true;
} short fontHeight = font.getFontHeightInPoints();
short fontSize = 3;
boolean isDefaultFontSize = false;
if (fontHeight <= RICH_FONT_SIZE_1) {
fontSize = 1;
} else if( fontHeight == RICH_FONT_SIZE_DEFAULT) {
isDefaultFontSize = true;
} else if(fontHeight <= RICH_FONT_SIZE_2) {
fontSize = 2;
} else if(fontHeight<= RICH_FONT_SIZE_3) {
fontSize = 3;
} else if(fontHeight<=RICH_FONT_SIZE_4) {
fontSize = 4;
} else if(fontHeight<=RICH_FONT_SIZE_5) {
fontSize = 5;
} else if(fontHeight<=RICH_FONT_SIZE_6) {
fontSize = 6;
} else {
fontSize = 7;
} if (colorClass != null) {
sb.append("<span class=\"" + colorClass+ "\">");
}
if (underlined) {
sb.append("<span class=\"" + RICH_CSS_02+ "\">");
}
if (isBold) {
sb.append("<span class=\"" + RICH_CSS_01+ "\">");
}
if (!isDefaultFontSize) {
sb.append("<font size=\"" + fontSize + "\">");
} //excelの値の特殊文字(例:<span></span>など)をescape
contentText = StringEscapeUtils.escapeXml11(contentText);
sb.append(contentText);
if (!isDefaultFontSize) {
sb.append("</font>");
} if (isBold) {
sb.append("</span>");
}
if (underlined) {
sb.append("</span>");
}
if (colorClass != null) {
sb.append("</span>");
} htmlStr = sb.toString();
htmlStr = htmlStr.replaceAll("\\R", "<br/>");
return htmlStr;
}

POI richText和html的转换案例的更多相关文章

  1. POI生成word文档完整案例及讲解

    一,网上的API讲解 其实POI的生成Word文档的规则就是先把获取到的数据转成xml格式的数据,然后通过xpath解析表单式的应用取值,判断等等,然后在把取到的值放到word文档中,最后在输出来. ...

  2. poi解析word文档转换成html(包括图片解析)

    需求:将本地上传的word文档解析并放入数据库中 代码: import java.io.ByteArrayOutputStream;import java.io.File;import java.io ...

  3. 【学亮IT手记】MySql行列转换案例

    create table score( name ), math int, english int ); ,); ,); ,); ,); SHOW tables; SELECT * from scor ...

  4. kettle——转换案例

    把stu1的数据按id同步到stu2,stu2有相同id则更新数据 (1)在mysql中创建两张表 mysql> create database kettle; mysql> use ke ...

  5. java poi Excel导入 整数浮点数转换问题解决

    /**     * 获取单元格数据     */    protected static String getCellValue(Cell cell) {        String cellValu ...

  6. C# 数组与 list 互相转换案例

    在项目中用到了 随手分享下 记得点赞呦! 1,从System.String[]转到List<System.String>System.String[] str={"str&quo ...

  7. poi导出excel

    Java使用poi组件导出excel报表,能导出excel报表的还可以使用jxl组件,但jxl想对于poi功能有限,jxl应该不能载excel插入浮动层图片,poi能很好的实现输出excel各种功能, ...

  8. 关于html转换为pdf案例的一些测试与思考

    由于工作所需,最近花时间研究了html转换为pdf的功能.html转换为pdf的关键技术是如何处理网页中复杂的css样式,通过在网上收集资料,发现目前html 转换为pdf的解决方案主要分为三类: 客 ...

  9. Java基础-处理json字符串解析案例

    Java基础-处理json字符串解析案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 作为一名开发人员,想必大家或多或少都有接触到XML文件,XML全称为“extensible ...

随机推荐

  1. 1--Postman使用token进行批量测试

    1. 先执行登陆接口,查看返回token是再响应头还是再响应体 有的返回再响应头中,有的再响应体中 2.设置环境变量token,并从登陆接口获取token赋值给环江变量 第一步:创建环境变量,值为空即 ...

  2. C#修改json文件中的某些值

    using Newtonsoft.Json; JsonSerializer serialiser = new JsonSerializer(); string newContent = string. ...

  3. xgboost中XGBClassifier()参数详解

    http://www.cnblogs.com/wanglei5205/p/8579244.html 常规参数 booster gbtree 树模型做为基分类器(默认) gbliner 线性模型做为基分 ...

  4. Git源码安装 Linux指定安装目录

    1.安装依赖包 $ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel 2.下载最新版源码包https: ...

  5. sql语言 含有包含关系的查询 (含mysql 和sql sever)

    一.sql中查询包含关系的查询 sql语句中包含关系可以使用 in 和exist,但有些时候仅仅用这两个是不够的,还有表示方法是  not exist(b expect a )可以表示a包含b. 二. ...

  6. #学习笔记#jsp

    jsp简介 JSP(Java Server Pages)是JavaWeb服务器端的动态资源,它与html页面的作用是相同的,显示数据和获取数据. jsp: 作为请求发起页面,例如显示表单.超链接. : ...

  7. Go Example--defer

    package main import ( "fmt" "os" ) func main() { f := createFile("/tmp/defe ...

  8. Excel技巧--文件批处理

    先认识几个dos命令: ren 旧文件名 新文件名:更改文件名: dir 文件路径 /b > 目标路径/表名.xls:查询指定文件路径下的所有文件,写入到目标路径下的excel文件中: md 新 ...

  9. forward reference前向引用,gloal values and local values全局变量和局部变量,recursive function递归函数

    1.全局变量与局部变量练习 1 # -*- coding: UTF-8 -*- 2 def bar(): 3 print('from bar') 4 def foo(): 5 print('from ...

  10. 解决python3.5无法导入cv2.so的问题

    问题描述: 在python3.5环境中导入cv2报错,在python2.7中正常.注:命令行的前缀RL_2018HW是python3.5的环境. (RL_2018HW) gordon@gordon-: ...