excel 显示html标签,POI Excel 上下标处理(sub,sup的HTML标签转化到excel格式)
用Apache POI把文字信息输出到Excel的时候,遇到如图的情况。HTML中这些上标下标是用‘,’包起来的
那么要导出到excel,如何让excel里面也显示如图的样子,而不是直接显示那些标签呢?
sup
sub
话不多说,先导包:
org.apache.poi
poi-ooxml
3.16
核心的代码就是:
String content="aaa2ccc"
//生成workbook
HSSFWorkbook workbook = new HSSFWorkbook();
//生成sheet
HSSFSheet sheet = workbook.createSheet("sheet1");
//生成行row(第一行)
HSSFRow row = sheet.createRow(0);
//创建单元格(第一行第一格)
HSSFCell cell = row.createCell(0);
//生成富文本文字
HSSFRichTextString text = new HSSFRichTextString(content);
//生成字体
HSSFFont ft = workbook.createFont();
//设置下标字体,sup的话此处设置HSSFFont.SS_SUPER
ft.setTypeOffset(HSSFFont.SS_SUB);
//设置字体生效的位置区间,content字符串去掉sub标签之后,第四个字符需要处理成下标,所以参数是3,4
//如果是content="aaa23ccc",位置参数就是3,5,不同位置可多次调用applyFont方法
text.applyFont(3,4,ft);
cell.setCellValue(text);
//TODO 输出文件
......
了解核心代码之后,需要做的就是解析字符串中的标签,然后按照这个方法处理。以下是我写的比较完整的解析例子。
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
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;
public class ExcelUtils2 {
private static final String SUB_START = "";
private static final String SUB_END = "";
private static final String SUP_START = "";
private static final String SUP_END = "";
public static void main(String[] args) {
String title = "一种F-、Zn2+、B3+离子协同掺杂电解质,H2O是水";
List> tagIndexArr = null;
if (containSubSup(title)) {
tagIndexArr = new ArrayList>();
title = getSubSupIndexs(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 subs = tagIndexArr.get(0);
List sups = tagIndexArr.get(1);
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);
}
}
cell.setCellValue(text);
} else {
cell.setCellValue(title);
}
try {
workbook.write(fout);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 获取下一对标签的index,不存在这些标签就返回null
* @param s
* @param tag SUB_START 或者SUP_START
* @return int[]中有两个元素,第一个是开始标签的index,第二个元素是结束标签的index
*/
private static int[] getNextSubsTagsIndex(String s, String tag) {
int firstSubStart = s.indexOf(tag);
if (firstSubStart > -1) {
int firstSubEnd = s.indexOf(tag.equals(SUB_START) ? SUB_END : SUP_END);
if (firstSubEnd > firstSubStart) {
return new int[] { firstSubStart, firstSubEnd };
}
}
return null;
}
/**移除下一对sub或者sup标签,返回移除后的字符串
* @param s
* @param tag SUB_START 或者SUP_START
* @return
*/
private static String removeNextSubTags(String s, String tag) {
s = s.replaceFirst(tag, "");
s = s.replaceFirst(tag.equals(SUB_START) ? SUB_END : SUP_END, "");
return s;
}
/**
* 判断是不是包含sub,sup标签
* @param s
* @return
*/
private static boolean containSubSup(String s) {
return (s.contains(SUB_START) && s.contains(SUB_END)) || (s.contains(SUP_START) && s.contains(SUP_END));
}
/**
* 处理字符串,得到每个sub,sup标签的开始和对应的结束的标签的index,方便后面根据这个标签做字体操作
* @param s
* @param tagIndexList 传一个新建的空list进来,方法结束的时候会存储好标签位置信息。
*
tagIndexList.get(0)存放的sub
*
tagIndexList.get(1)存放的是sup
*
* @return 返回sub,sup处理完之后的字符串
*/
private static String getSubSupIndexs(String s, List> tagIndexList) {
List subs = new ArrayList();
List sups = new ArrayList();
while (true) {
int[] sub_pair = getNextSubsTagsIndex(s, SUB_START);
int[] sup_pair = getNextSubsTagsIndex(s, SUP_START);
boolean subFirst = true;
boolean supFirst = true;
if(sub_pair != null && sup_pair != null) {
//两种标签都存在的时候要考虑到谁在前,在前的标签优先处理
//因为如果在后的标签处理完,index就定下来,再处理在前的,后面的index就会产生偏移量。从前开始处理不会存在这个问题
if(sub_pair[0] < sup_pair[0]) {
supFirst = false;
} else {
subFirst = false;
}
}
if (sub_pair != null && subFirst) {
s = removeNextSubTags(s, SUB_START);
//标签被去掉之后,结束标签需要相应往前移动
sub_pair[1] = sub_pair[1] - SUB_START.length();
subs.add(sub_pair);
continue;
}
if (sup_pair != null && supFirst) {
s = removeNextSubTags(s, SUP_START);
//标签被去掉之后,结束标签需要相应往前移动
sup_pair[1] = sup_pair[1] - SUP_START.length();
sups.add(sup_pair);
continue;
}
if (sub_pair == null && sup_pair == null) {
break;
}
}
tagIndexList.add(subs);
tagIndexList.add(sups);
return s;
}
}
OJBK!!!
excel 显示html标签,POI Excel 上下标处理(sub,sup的HTML标签转化到excel格式)相关推荐
- Excel一键将化学式调整数字上下标
哎呀这个操作真是闻所未闻啊,一下子就解决了化学老师的整理试卷的难题,所有的化学式都是标准的样式,看看小编是如何操作的吧 (方方格子插件) 1.先上动图 2.选中数据区域 3.选择方方格子按钮 4.选择 ...
- .net导出到Excel与Word中(带上下标)
//输出到excel的函数,可直接copy到 cs页面 private void OutExcel(GridView dg, string name) { dg.Vis ...
- php 生成excel空白,phpexcel库在localhost上运行良好,但在服务器中生成空白的excel文件...
这是我的代码,在本地主机上可以很好地使用数据库中的数据生成一个excel文件,但在托管服务器中它会生成一个空白的excel文件: // Starting the PHPExcel library $t ...
- java excel 设置列为日期,POI - 如何将单元格值设置为日期并应用默认Excel日期格式?...
此代码示例可用于更改日期格式 . 在这里,我想从yyyy-MM-dd改为dd-MM-yyyy . 这里 pos 是列的位置 . import org.apache.poi.ss.usermodel.C ...
- excel上下标录入技巧
第一,通过设置单元格格式设置excel上下标\ 专业免费答疑各种Excel问题,群文件有视频教程,对Excel感兴趣的朋友可加Excel学习交流群:284029260 双击选中excel工作 ...
- 输入上/下标数字以及字母
输入上/下标数字以及字母 H5上标标签 H5下标标签 Word 附上一些常用上下标 H5上标标签 //X² <p>X<sup>2</sup></p> / ...
- 上下标 java_java包POI处理excel上下标的代码分享
原理是逐字检查发现,即使用sup,sub的网页标签替换. 含有2003版本和2007版本 package com.uet.common.utils; import org.apache.commons ...
- 【Java】Java POI 设置Excel单元格上下标
背景 由于最近楼主做的是新冠检测相关的系统,其中有涉及导出Excel的需求.按平时封装的导出工具类基本也就满足了,但是最近来了一个要求某些列要有上下标,所以给大家贴出上下标的关键代码,以后抄作业的时候 ...
- html同时上下标签,excel如何同时设置上下标
怎样在excel中同时输入上下标 在单元格上点击鼠标右键,选择"设置单元格格式". 在打开的窗口中,在"数字"选项卡的"分类"中,选择&qu ...
- apache poi excel显示 base64 图片_数据处理之带图片Excel数据处理解惑
小编最近项目中遇到一个大批量Excel数据提取的问题,因为Excel数据中含有图片,所以在程序处理时遇到了困难,小编花了点时间才解决了这个问题,所以在这里mark一下. 1 问题描述 首先来描述一下数 ...
最新文章
- 单继承--多态性 多继承--二义性 ambiguous
- elementUI树状图竖向滚动条和横向滚动条问题
- 优胜劣汰有利于整个团购行业服务的提升
- stderr和stdout(printf、fprintf、sprintf)(转)
- JQuery 自动触发 a 标签的 click事件
- PCB设计过孔选用指导
- 14岁AI天才的钢铁之心
- python获取token并登录,Python token的获取和再次登录验证
- 互联网推送服务原理:长连接+心跳机制(MQTT协议)
- tastypie使用cache对list data无效问题
- 问题解决之——未知usb设备设备描述符请求失败(Jlink驱动)
- IDM下载工具(免费下载视频、音乐、图片等文件)
- 英特尔老款CPU支持虚拟化对照表(转)
- mysql中selectform_数据库中select...from....where....各表示什么意思
- 计算机组成原理sp接口,计算机组成原理2008年4月真题试题(02318)
- uniapp之自定义顶部样式
- iOS wifi认证
- js练习:筋斗云案例练习
- 24年前他被余承东招入华为,现在掌舵第四大事业群,对垒阿里张建锋、百度王海峰,腾讯汤道生...
- CAD梦想画图中的“绘图工具——点”