用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格式)相关推荐

  1. Excel一键将化学式调整数字上下标

    哎呀这个操作真是闻所未闻啊,一下子就解决了化学老师的整理试卷的难题,所有的化学式都是标准的样式,看看小编是如何操作的吧 (方方格子插件) 1.先上动图 2.选中数据区域 3.选择方方格子按钮 4.选择 ...

  2. .net导出到Excel与Word中(带上下标)

    //输出到excel的函数,可直接copy到 cs页面     private void OutExcel(GridView dg, string name)     {         dg.Vis ...

  3. php 生成excel空白,phpexcel库在localhost上运行良好,但在服务器中生成空白的excel文件...

    这是我的代码,在本地主机上可以很好地使用数据库中的数据生成一个excel文件,但在托管服务器中它会生成一个空白的excel文件: // Starting the PHPExcel library $t ...

  4. java excel 设置列为日期,POI - 如何将单元格值设置为日期并应用默认Excel日期格式?...

    此代码示例可用于更改日期格式 . 在这里,我想从yyyy-MM-dd改为dd-MM-yyyy . 这里 pos 是列的位置 . import org.apache.poi.ss.usermodel.C ...

  5. excel上下标录入技巧

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

  6. 输入上/下标数字以及字母

    输入上/下标数字以及字母 H5上标标签 H5下标标签 Word 附上一些常用上下标 H5上标标签 //X² <p>X<sup>2</sup></p> / ...

  7. 上下标 java_java包POI处理excel上下标的代码分享

    原理是逐字检查发现,即使用sup,sub的网页标签替换. 含有2003版本和2007版本 package com.uet.common.utils; import org.apache.commons ...

  8. 【Java】Java POI 设置Excel单元格上下标

    背景 由于最近楼主做的是新冠检测相关的系统,其中有涉及导出Excel的需求.按平时封装的导出工具类基本也就满足了,但是最近来了一个要求某些列要有上下标,所以给大家贴出上下标的关键代码,以后抄作业的时候 ...

  9. html同时上下标签,excel如何同时设置上下标

    怎样在excel中同时输入上下标 在单元格上点击鼠标右键,选择"设置单元格格式". 在打开的窗口中,在"数字"选项卡的"分类"中,选择&qu ...

  10. apache poi excel显示 base64 图片_数据处理之带图片Excel数据处理解惑

    小编最近项目中遇到一个大批量Excel数据提取的问题,因为Excel数据中含有图片,所以在程序处理时遇到了困难,小编花了点时间才解决了这个问题,所以在这里mark一下. 1 问题描述 首先来描述一下数 ...

最新文章

  1. 单继承--多态性 多继承--二义性 ambiguous
  2. elementUI树状图竖向滚动条和横向滚动条问题
  3. 优胜劣汰有利于整个团购行业服务的提升
  4. stderr和stdout(printf、fprintf、sprintf)(转)
  5. JQuery 自动触发 a 标签的 click事件
  6. PCB设计过孔选用指导
  7. 14岁AI天才的钢铁之心
  8. python获取token并登录,Python token的获取和再次登录验证
  9. 互联网推送服务原理:长连接+心跳机制(MQTT协议)
  10. tastypie使用cache对list data无效问题
  11. 问题解决之——未知usb设备设备描述符请求失败(Jlink驱动)
  12. IDM下载工具(免费下载视频、音乐、图片等文件)
  13. 英特尔老款CPU支持虚拟化对照表(转)
  14. mysql中selectform_数据库中select...from....where....各表示什么意思
  15. 计算机组成原理sp接口,计算机组成原理2008年4月真题试题(02318)
  16. uniapp之自定义顶部样式
  17. iOS wifi认证
  18. js练习:筋斗云案例练习
  19. 24年前他被余承东招入华为,现在掌舵第四大事业群,对垒阿里张建锋、百度王海峰,腾讯汤道生...
  20. CAD梦想画图中的“绘图工具——点”

热门文章

  1. neo4j 社区版主从集群
  2. 多元线性回归之Spss实现
  3. 单条视频播放3700w+,生鲜产品如何开启变现之路?
  4. 微信小程序+Servlet后台开发(一)
  5. Android Framework 窗口子系统 (08)窗口动画之动画系统框架
  6. 互联网+业务转型,云计算厂商对比
  7. 计算机系统——buflab
  8. 卡位亚洲新门户,华为云泰国开服
  9. C# 体检套餐管理系统
  10. 内容付费时代,你愿意为文章付费吗?