POI richText和html的转换案例
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的转换案例的更多相关文章
- POI生成word文档完整案例及讲解
一,网上的API讲解 其实POI的生成Word文档的规则就是先把获取到的数据转成xml格式的数据,然后通过xpath解析表单式的应用取值,判断等等,然后在把取到的值放到word文档中,最后在输出来. ...
- poi解析word文档转换成html(包括图片解析)
需求:将本地上传的word文档解析并放入数据库中 代码: import java.io.ByteArrayOutputStream;import java.io.File;import java.io ...
- 【学亮IT手记】MySql行列转换案例
create table score( name ), math int, english int ); ,); ,); ,); ,); SHOW tables; SELECT * from scor ...
- kettle——转换案例
把stu1的数据按id同步到stu2,stu2有相同id则更新数据 (1)在mysql中创建两张表 mysql> create database kettle; mysql> use ke ...
- java poi Excel导入 整数浮点数转换问题解决
/** * 获取单元格数据 */ protected static String getCellValue(Cell cell) { String cellValu ...
- C# 数组与 list 互相转换案例
在项目中用到了 随手分享下 记得点赞呦! 1,从System.String[]转到List<System.String>System.String[] str={"str&quo ...
- poi导出excel
Java使用poi组件导出excel报表,能导出excel报表的还可以使用jxl组件,但jxl想对于poi功能有限,jxl应该不能载excel插入浮动层图片,poi能很好的实现输出excel各种功能, ...
- 关于html转换为pdf案例的一些测试与思考
由于工作所需,最近花时间研究了html转换为pdf的功能.html转换为pdf的关键技术是如何处理网页中复杂的css样式,通过在网上收集资料,发现目前html 转换为pdf的解决方案主要分为三类: 客 ...
- Java基础-处理json字符串解析案例
Java基础-处理json字符串解析案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 作为一名开发人员,想必大家或多或少都有接触到XML文件,XML全称为“extensible ...
随机推荐
- 入门项目 A2 setting
import os # 因为setting是设置模块,存放的是一些和系统关联的一些信息,比如对C,D盘符的路径调用 BASE_PATH = os.path.dirname(os.path.dirnam ...
- Sql Server索引重建
公司线上数据有几千万数据,有时候索引碎片会导致索引达不到我们的预期查询效率,这个时候将索引重建将会提升一定效率,不过重建的时候一定得晚上用户少的时候,索引重建需要一定时间. 直接贴自动重建索引脚本吧 ...
- vm虚拟机下ubuntu连接上ssr
第一步: 第二步: 第三步: 第四步: 完成!
- 自动化测试-14.selenium加载FireFox配置
前言 有小伙伴在用脚本启动浏览器时候发现原来下载的插件不见了,无法用firebug在打开的页面上继续定位页面元素,调试起来不方便 . 加载浏览器配置,需要用FirefoxProfile(profile ...
- IC卡_状态码SW1、SW2
9000 正常 成功执行 61xx 正常 需要发GET RESPONSE命令 6200 警告 信息未提供 6281 警告 回送数据可能出错 6282 警告 文件长度小于Le 6283 警告 选中的文件 ...
- Tomcat7.0/8.0 详细安装配置图解,以及UTF-8编码配置
Tomcat7.0/8.0 详细安装配置图解,以及UTF-8编码配置 2017年01月24日 10:01:48 阅读数:51265 标签: tomcattomcat安装tomcat配置tomcat编码 ...
- Python全栈之路----函数----返回值
函数外部的代码想要获取函数的执行结果,就可以在函数里用return语句,把结果返回. def stu_register(name,age,course='PY',country='CN'): prin ...
- Web Server和Application Server之间的区别?
An "application server" is a fuzzy concept. Really, it just means software that hosts plug ...
- tomcat8.5配置redis实现session共享(tomcat-redis-session-manager-master)
1.将下面几个jar包依赖放到tomcat的lib目录下: 2.修改tomcat/conf下context.xml文件,在<Context>节点添加如下代码: <Valve clas ...
- 一个nginx服务器配置多站点
有时候你想在一台服务器上为不同的域名运行不同的站点.比如www.siteA.com作为博客,www.siteB.com作为论坛.你可以把两个域名的IP都解析到你的服务器上,但是没法在Nginx的根目录 ...