目前该代码暂不支持多标签嵌套的字符串,只适合多标签、无嵌套字符串。如果有改进,我会第一时间更新代码。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Font;public class ExcelUtils {private static final String SUB_START = "<sub>";  //下标private static final String SUB_END = "</sub>";private static final String SUP_START = "<sup>";   //上标private static final String SUP_END = "</sup>";private static final String U_START = "<u>";       //下划线private static final String U_END = "</u>";private static final String STRONG_START = "<strong>";        //粗体private static final String STRONG_END = "</strong>";private static final String EM_START = "<em>";       //斜体private static final String EM_END = "</em>";public static void main(String[] args) {String title = "一种F<sup>-</sup>、Zn<sup>2+</sup>、B<sup>3+</sup>离子协同掺杂电解质,H<sub>2</sub>O是<u>水</u>,<strong>水</strong>是<em>生命</em>之源!<span>span标签测试</span>,"+ "空白下划线:<span class=\"item-blank\"></span>,<span class=\"item-blank\">下划线</span>,空白下划线:<span class=\"item-blank\"></span>,"+ "<table><tbody><tr><td width=\"209\">表格</td></tr></tbody></table>,<span>span标签测试</span>。";if (title.contains("<span class=\"item-blank\">")) {title = title.replaceAll("(?!<(sup|/sup|sub|/sub|u|/u|strong|/strong|em|/em|span|/span).*?>)<.*?>", "");while (true) {if (title.contains("<span class=\"item-blank\">") && title.contains("<span>")) {if (title.indexOf("<span>")<title.indexOf("<span class=\"item-blank\">")) {title = title.replaceFirst("<span>", "").replaceFirst("</span>", "");}else {title = title.replaceFirst("<span class=\"item-blank\">", "<u>  ").replaceFirst("</span>", "  </u>");}}else if (title.contains("<span class=\"item-blank\">")) {title = title.replaceFirst("<span class=\"item-blank\">", "<u>  ").replaceFirst("</span>", "  </u>");}else if (title.contains("<span>")) {title = title.replaceFirst("<span>", "").replaceFirst("</span>", "");}else {break;}}}title = title.replaceAll("(?!<(sup|/sup|sub|/sub|u|/u|strong|/strong|em|/em).*?>)<.*?>", "");List<List<int[]>> tagIndexArr = null;if (containTag(title)) {tagIndexArr = new ArrayList<List<int[]>>();title = getIndexs(title, tagIndexArr);}//TODO 文件路径自己改File f = new File("C:\\tmp\\test.xls");try {FileOutputStream fout = new FileOutputStream(f);// 声明一个工作薄@SuppressWarnings("resource")HSSFWorkbook workbook = new HSSFWorkbook();// 生成一个表格HSSFSheet sheet = workbook.createSheet("sheet1");int curRowIndex = 0;HSSFRow row = sheet.createRow(curRowIndex);HSSFCell cell = row.createCell(0);if (tagIndexArr != null) {HSSFRichTextString text = new HSSFRichTextString(title);List<int[]> subs = tagIndexArr.get(0);List<int[]> sups = tagIndexArr.get(1);List<int[]> us = tagIndexArr.get(2);List<int[]> strongs = tagIndexArr.get(3);List<int[]> ems = tagIndexArr.get(4);if (subs.size() > 0) {HSSFFont ft = workbook.createFont();ft.setTypeOffset(HSSFFont.SS_SUB);for (int[] pair : subs) {text.applyFont(pair[0], pair[1], ft);}}if (sups.size() > 0) {HSSFFont ft = workbook.createFont();ft.setTypeOffset(HSSFFont.SS_SUPER);for (int[] pair : sups) {text.applyFont(pair[0], pair[1], ft);}}if (us.size() > 0) {HSSFFont ft = workbook.createFont();ft.setUnderline(Font.U_SINGLE);for (int[] pair : us) {text.applyFont(pair[0], pair[1], ft);}}if (strongs.size() > 0) {HSSFFont ft = workbook.createFont();ft.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);for (int[] pair : strongs) {text.applyFont(pair[0], pair[1], ft);}}if (ems.size() > 0) {HSSFFont ft = workbook.createFont();ft.setItalic(true);for (int[] pair : ems) {text.applyFont(pair[0], pair[1], ft);}}cell.setCellValue(text);} else {cell.setCellValue(title);}try {workbook.write(fout);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 获取下一对标签的index,不存在这些标签就返回null* @param s* @param tag SUB_START或者SUP_START或者U_START或者STRONG_START或者EM_START* @return int[]中有两个元素,第一个是开始标签的index,第二个元素是结束标签的index*/public static int[] getNextTagsIndex(String s, String tag) {int firstStart = s.indexOf(tag);if (firstStart > -1) {int firstEnd = 0;if (tag.equals(SUB_START)) {firstEnd = s.indexOf(SUB_END);}else if (tag.equals(SUP_START)) {firstEnd = s.indexOf(SUP_END);}else if (tag.equals(U_START)) {firstEnd = s.indexOf(U_END);}else if (tag.equals(STRONG_START)) {firstEnd = s.indexOf(STRONG_END);}else if (tag.equals(EM_START)) {firstEnd = s.indexOf(EM_END);}if (firstEnd > firstStart) {return new int[] { firstStart, firstEnd };}}return null;}/**移除下一对sub或者sup或者u或者strong或者em标签,返回移除后的字符串* @param s* @param tag SUB_START或者SUP_START或者U_START或者STRONG_START或者EM_START* @return*/public static String removeNextTags(String s, String tag) {s = s.replaceFirst(tag, "");if (tag.equals(SUB_START)) {s = s.replaceFirst(SUB_END, "");}else if (tag.equals(SUP_START)) {s = s.replaceFirst(SUP_END, "");}else if (tag.equals(U_START)) {s = s.replaceFirst(U_END, "");}else if (tag.equals(STRONG_START)) {s = s.replaceFirst(STRONG_END, "");}else if (tag.equals(EM_START)) {s = s.replaceFirst(EM_END, "");}return s;}/*** 判断是不是包含sub、sup、u、strong、em标签* @param s* @return*/public static boolean containTag(String s) {return (s.contains(SUB_START) && s.contains(SUB_END)) || (s.contains(SUP_START) && s.contains(SUP_END))|| (s.contains(U_START) && s.contains(U_END)) || (s.contains(STRONG_START) && s.contains(STRONG_END))|| (s.contains(EM_START) && s.contains(EM_END));}/*** 处理字符串,得到每个sub、sup、u、strong、em标签的开始和对应的结束的标签的index,方便后面根据这个标签做字体操作* @param s* @param tagIndexList 传一个新建的空list进来,方法结束的时候会存储好标签位置信息。* <br>tagIndexList.get(0)存放的sub* <br>tagIndexList.get(1)存放的是sup* <br>tagIndexList.get(2)存放的是u* <br>tagIndexList.get(3)存放的是strong* <br>tagIndexList.get(4)存放的是em* * @return 返回sub、sup、u、strong、em处理完之后的字符串*/public static String getIndexs(String s, List<List<int[]>> tagIndexList) {List<int[]> subs = new ArrayList<int[]>();List<int[]> sups = new ArrayList<int[]>();List<int[]> us = new ArrayList<int[]>();List<int[]> strongs = new ArrayList<int[]>();List<int[]> ems = new ArrayList<int[]>();while (true) {int[] sub_pair = getNextTagsIndex(s, SUB_START);int[] sup_pair = getNextTagsIndex(s, SUP_START);int[] u_pair = getNextTagsIndex(s, U_START);int[] strong_pair = getNextTagsIndex(s, STRONG_START);int[] em_pair = getNextTagsIndex(s, EM_START);boolean subFirst = false;boolean supFirst = false;boolean uFirst = false;boolean strongFirst = false;boolean emFirst = false;List a = new ArrayList();if (!StringUtil.isEmpty(sub_pair)) {a.add(sub_pair[0]);}if (!StringUtil.isEmpty(sup_pair)) {a.add(sup_pair[0]);}if (!StringUtil.isEmpty(u_pair)) {a.add(u_pair[0]);}if (!StringUtil.isEmpty(strong_pair)) {a.add(strong_pair[0]);}if (!StringUtil.isEmpty(em_pair)) {a.add(em_pair[0]);}Collections.sort(a);if (!StringUtil.isEmpty(sub_pair)) {if (sub_pair[0] == Integer.parseInt(a.get(0).toString())) {subFirst = true;}}if (!StringUtil.isEmpty(sup_pair)) {if (sup_pair[0] == Integer.parseInt(a.get(0).toString())) {supFirst = true;}}if (!StringUtil.isEmpty(u_pair)) {if (u_pair[0] == Integer.parseInt(a.get(0).toString())) {uFirst = true;}}if (!StringUtil.isEmpty(strong_pair)) {if (strong_pair[0] == Integer.parseInt(a.get(0).toString())) {strongFirst = true;}}if (!StringUtil.isEmpty(em_pair)) {if (em_pair[0] == Integer.parseInt(a.get(0).toString())) {emFirst = true;}}if (sub_pair != null && subFirst) {s = removeNextTags(s, SUB_START);//<sub>标签被去掉之后,结束标签需要相应往前移动sub_pair[1] = sub_pair[1] - SUB_START.length();subs.add(sub_pair);continue;}if (sup_pair != null && supFirst) {s = removeNextTags(s, SUP_START);//<sup>标签被去掉之后,结束标签需要相应往前移动sup_pair[1] = sup_pair[1] - SUP_START.length();sups.add(sup_pair);continue;}if (u_pair != null && uFirst) {s = removeNextTags(s, U_START);//<u>标签被去掉之后,结束标签需要相应往前移动u_pair[1] = u_pair[1] - U_START.length();us.add(u_pair);continue;}if (strong_pair != null && strongFirst) {s = removeNextTags(s, STRONG_START);//<strong>标签被去掉之后,结束标签需要相应往前移动strong_pair[1] = strong_pair[1] - STRONG_START.length();strongs.add(strong_pair);continue;}if (em_pair != null && emFirst) {s = removeNextTags(s, EM_START);//<em>标签被去掉之后,结束标签需要相应往前移动em_pair[1] = em_pair[1] - EM_START.length();ems.add(em_pair);continue;}if (sub_pair == null && sup_pair == null && u_pair == null && strong_pair == null && em_pair == null) {break;}}tagIndexList.add(subs);tagIndexList.add(sups);tagIndexList.add(us);tagIndexList.add(strongs);tagIndexList.add(ems);return s;}
}

POI Excel 上下标、下划线、粗体、斜体标签处理(sup、sub、u、strong、em的HTML标签转化到excel格式)①相关推荐

  1. excel上下标录入技巧

    第一,通过设置单元格格式设置excel上下标\      专业免费答疑各种Excel问题,群文件有视频教程,对Excel感兴趣的朋友可加Excel学习交流群:284029260 双击选中excel工作 ...

  2. Excel批量设置下划线

    Excel批量设置下划线 目录 Excel批量设置下划线 1.框选需要设置的单元格内容,鼠标右键选择"设置单元格格式" 2.点击"自定义"在类型框中输入&quo ...

  3. html中设置字体字型,html中 如何在font中设置字体样式(粗体斜体等)

    html> 字体加粗 用<b>加粗字体:加粗 用<strong>加粗字体:加粗 用CSS font-weight 加粗 normal(400), bold(700)    ...

  4. android字体斜体代码,Android设置Roboto字体用粗体,斜体,常规,…(类似于自定义字体系列)...

    我知道在Android应用程序中以编程方式设置自定义字体. 有没有办法为自定义字体(资产)加载字体,Android框架将使用基于粗体,斜体等的正确文件? 例如,现在我正在尝试将Roboto字体设置为某 ...

  5. R语言使用plot函数可视化数据散点图,使用font参数指定字体类型为粗体斜体字体(bold italics)

    R语言使用plot函数可视化数据散点图,使用font参数指定字体类型为粗体斜体字体(bold italics) 目录

  6. POI Excel 上下标、下划线、粗体、斜体标签处理(sup、sub、u、strong、em的HTML标签转化到excel格式)②

    由于上篇写的代码不支持多标签嵌套的字符串,项目中容易报错:java.lang.IllegalArgumentException: Start and end index not in range. 目 ...

  7. excel 显示html标签,POI Excel 上下标处理(sub,sup的HTML标签转化到excel格式)

    用Apache POI把文字信息输出到Excel的时候,遇到如图的情况.HTML中这些上标下标是用','包起来的 那么要导出到excel,如何让excel里面也显示如图的样子,而不是直接显示那些标签呢 ...

  8. latex如何设置字体并加粗_Latex设置字体大小,加粗,加下划线,变斜体_孩纸气_新浪博客...

    Latex 设置字体大小命令由小到大依次为: \tiny \scriptsize \footnotesize \small \normalsize \large \Large \LARGE \huge ...

  9. 一些小标签(上标下标下划线等)

    <div>log<sup>n</sup></div> <div>H<sub>2</sub>O</div> ...

最新文章

  1. (转载)jsp与servlet之间页面跳转及参数传递实例
  2. PHP多选题怎么弄,php多选题评分算法求指导解决方法
  3. ASP.NET中序列化与反序列化-以显示上一次登录的信息为例
  4. 数据库 三范式最简单最易记的解释
  5. WinSock重叠I/O模型
  6. weblogic启动慢
  7. ADODB.Stream 错误 '800a0bbc' 写入文件失败
  8. 计算机的未来科技作文700字,未来的科技与绿*的作文700字
  9. javabean和java类_java对象 POJO和JavaBean的区别
  10. java中request常用方法小结
  11. hadoop大数据平台_Hadoop之外的3个大数据平台
  12. win98装python_Windows 上的 Python安装
  13. 数据存储与容灾(第2版)主编 鲁先志 武春岭综合训练答案
  14. 百度将于今年下半年推出“哼唱搜索”
  15. 拼多多校招-----六一儿童节(python)
  16. 抓取、下载某位博主的豆瓣日记
  17. 【PCIe 5.0 - 1】PCIe Link属性
  18. 大数据进阶之路——Spark SQL 之 DataFrameDataset
  19. STC51单片机23——T2定时器的使用
  20. 网龙网络控股有限公司公布二零一八年中期业绩

热门文章

  1. 基于EF框架的数据库操作方法
  2. 线性代数中特殊行列式的计算
  3. 【机器学习】在浏览器端实践机器学习,需要考虑哪些注意事项
  4. 安全 安全 安全……
  5. vue2.x源码解析(一)
  6. GMap.net地图下载器
  7. oracle wrap 限制,oracle wrap 加密 | 学步园
  8. 河北外国语学院对口计算机,河北外国语学院各批次专业报考代码,6月28日起你绝对要用!...
  9. 敏捷环境中的TMMi之6-测试绩效指标(TPI)
  10. 基于51单片机的无线防盗报警器