1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > POI Excel 上下标 下划线 粗体 斜体标签处理(sup sub u strong em的HTML标签转化到excel格式)②

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

时间:2021-11-06 06:45:49

相关推荐

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

由于上篇写的代码不支持多标签嵌套的字符串,项目中容易报错:java.lang.IllegalArgumentException: Start and end index not in range. 目前只想到了避免该异常方案:遇到多标签嵌套时,仅保留最外层标签 (⊙﹏⊙!!),很遗憾暂时还没想到比较完美解决办法,同样,如果有改进,我会第一时间更新代码。

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><u><em>水</em></u></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);String ssString = s.substring(firstStart, firstEnd+SUB_END.length());if (ssString.contains(SUP_START)||ssString.contains(U_START)||ssString.contains(STRONG_START)||ssString.contains(EM_START)) {ssString = ssString.replace(SUP_START, "").replaceAll(SUP_END, "").replaceAll(U_START, "").replaceAll(U_END, "").replaceAll(STRONG_START, "").replaceAll(STRONG_END, "").replaceAll(EM_START, "").replaceAll(EM_END, "");firstEnd = firstStart + ssString.indexOf(SUB_END);}}else if (tag.equals(SUP_START)) {firstEnd = s.indexOf(SUP_END);String ssString = s.substring(firstStart, firstEnd+SUP_END.length());if (ssString.contains(SUB_START)||ssString.contains(U_START)||ssString.contains(STRONG_START)||ssString.contains(EM_START)) {ssString = ssString.replace(SUP_START, "").replaceAll(SUP_END, "").replaceAll(U_START, "").replaceAll(U_END, "").replaceAll(STRONG_START, "").replaceAll(STRONG_END, "").replaceAll(EM_START, "").replaceAll(EM_END, "");firstEnd = firstStart + ssString.indexOf(SUP_END);}}else if (tag.equals(U_START)) {firstEnd = s.indexOf(U_END);String ssString = s.substring(firstStart, firstEnd+U_END.length());if (ssString.contains(SUB_START)||ssString.contains(SUP_START)||ssString.contains(STRONG_START)||ssString.contains(EM_START)) {ssString = ssString.replace(SUP_START, "").replaceAll(SUP_END, "").replaceAll(SUB_START, "").replaceAll(SUB_END, "").replaceAll(STRONG_START, "").replaceAll(STRONG_END, "").replaceAll(EM_START, "").replaceAll(EM_END, "");firstEnd = firstStart + ssString.indexOf(U_END);}}else if (tag.equals(STRONG_START)) {firstEnd = s.indexOf(STRONG_END);String ssString = s.substring(firstStart, firstEnd+STRONG_END.length());if (ssString.contains(SUB_START)||ssString.contains(U_START)||ssString.contains(SUP_START)||ssString.contains(EM_START)) {ssString = ssString.replace(SUP_START, "").replaceAll(SUP_END, "").replaceAll(U_START, "").replaceAll(U_END, "").replaceAll(SUB_START, "").replaceAll(SUB_END, "").replaceAll(EM_START, "").replaceAll(EM_END, "");firstEnd = firstStart + ssString.indexOf(STRONG_END);}}else if (tag.equals(EM_START)) {firstEnd = s.indexOf(EM_END);String ssString = s.substring(firstStart, firstEnd+EM_END.length());if (ssString.contains(SUB_START)||ssString.contains(U_START)||ssString.contains(SUP_START)||ssString.contains(STRONG_START)) {ssString = ssString.replace(SUP_START, "").replaceAll(SUP_END, "").replaceAll(U_START, "").replaceAll(U_END, "").replaceAll(SUB_START, "").replaceAll(SUB_END, "").replaceAll(STRONG_START, "").replaceAll(STRONG_END, "");firstEnd = firstStart + ssString.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);if (!StringUtil.isEmpty(sub_pair)) {int firstStart = sub_pair[0];if (firstStart > -1) {int firstEnd = s.indexOf(SUB_END);String startString = s.substring(0, firstStart);String centreString = s.substring(firstStart, firstEnd);String endString = s.substring(firstEnd, s.length());if (centreString.contains(SUP_START)||centreString.contains(U_START)||centreString.contains(STRONG_START)||centreString.contains(EM_START)) {centreString = centreString.replaceAll(SUP_START, "").replaceAll(SUP_END, "").replaceAll(U_START, "").replaceAll(U_END, "").replaceAll(STRONG_START, "").replaceAll(STRONG_END, "").replaceAll(EM_START, "").replaceAll(EM_END, "");s = startString + centreString + endString;}}}int[] sup_pair = getNextTagsIndex(s, SUP_START);if (!StringUtil.isEmpty(sup_pair)) {int firstStart = sup_pair[0];if (firstStart > -1) {int firstEnd = s.indexOf(SUP_END);String startString = s.substring(0, firstStart);String centreString = s.substring(firstStart, firstEnd);String endString = s.substring(firstEnd, s.length());if (centreString.contains(SUB_START)||centreString.contains(U_START)||centreString.contains(STRONG_START)||centreString.contains(EM_START)) {centreString = centreString.replaceAll(SUB_START, "").replaceAll(SUB_END, "").replaceAll(U_START, "").replaceAll(U_END, "").replaceAll(STRONG_START, "").replaceAll(STRONG_END, "").replaceAll(EM_START, "").replaceAll(EM_END, "");s = startString + centreString + endString;}}}int[] u_pair = getNextTagsIndex(s, U_START);if (!StringUtil.isEmpty(u_pair)) {int firstStart = u_pair[0];if (firstStart > -1) {int firstEnd = s.indexOf(U_END);String startString = s.substring(0, firstStart);String centreString = s.substring(firstStart, firstEnd);String endString = s.substring(firstEnd, s.length());if (centreString.contains(SUB_START)||centreString.contains(SUP_START)||centreString.contains(STRONG_START)||centreString.contains(EM_START)) {centreString = centreString.replaceAll(SUB_START, "").replaceAll(SUB_END, "").replaceAll(SUP_START, "").replaceAll(SUP_END, "").replaceAll(STRONG_START, "").replaceAll(STRONG_END, "").replaceAll(EM_START, "").replaceAll(EM_END, "");s = startString + centreString + endString;}}}int[] strong_pair = getNextTagsIndex(s, STRONG_START);if (!StringUtil.isEmpty(strong_pair)) {int firstStart = strong_pair[0];if (firstStart > -1) {int firstEnd = s.indexOf(STRONG_END);String startString = s.substring(0, firstStart);String centreString = s.substring(firstStart, firstEnd);String endString = s.substring(firstEnd, s.length());if (centreString.contains(SUB_START)||centreString.contains(SUP_START)||centreString.contains(U_START)||centreString.contains(EM_START)) {centreString = centreString.replaceAll(SUB_START, "").replaceAll(SUB_END, "").replaceAll(SUP_START, "").replaceAll(SUP_END, "").replaceAll(U_START, "").replaceAll(U_END, "").replaceAll(EM_START, "").replaceAll(EM_END, "");s = startString + centreString + endString;}}}int[] em_pair = getNextTagsIndex(s, EM_START);if (!StringUtil.isEmpty(em_pair)) {int firstStart = em_pair[0];if (firstStart > -1) {int firstEnd = s.indexOf(EM_END);String startString = s.substring(0, firstStart);String centreString = s.substring(firstStart, firstEnd);String endString = s.substring(firstEnd, s.length());if (centreString.contains(SUB_START)||centreString.contains(SUP_START)||centreString.contains(STRONG_START)||centreString.contains(U_START)) {centreString = centreString.replaceAll(SUB_START, "").replaceAll(SUB_END, "").replaceAll(SUP_START, "").replaceAll(SUP_END, "").replaceAll(STRONG_START, "").replaceAll(STRONG_END, "").replaceAll(U_START, "").replaceAll(U_END, "");s = startString + centreString + endString;}}}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;}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。