hssfrow 单元格样式_POI实现上标下标和单元格部分样式修改
为啥还要写这个呢?
因为有上标下标的单元格 有些字体的样式没有变,所以有了部分样式修改。
核心代码
text.applyFont()用这个api 对不同位置的字体用不同的样式即可。
// 上标
HSSFFont ft = workbook.createFont();
ft.setTypeOffset(HSSFFont.SS_SUPER);
// 加粗
HSSFFont font = workbook.createFont();
font.setBold(true);
font.setFontHeightInPoints((short) 10);
for (int[] pair : sups) {
text.applyFont(pair[0], pair[1], ft);
text.applyFont(pair[1], title.length(), font);
}
例子
image.png
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: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);
// 加粗
HSSFFont font = workbook.createFont();
font.setBold(true);
font.setFontHeightInPoints((short) 10);
for (int[] pair : sups) {
text.applyFont(pair[0], pair[1], ft);
text.applyFont(pair[1], title.length(), font);
}
}
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[] subPair = getNextSubsTagsIndex(s, SUB_START);
int[] supPair = getNextSubsTagsIndex(s, SUP_START);
boolean subFirst = true;
boolean supFirst = true;
if(subPair != null && supPair != null) {
//两种标签都存在的时候要考虑到谁在前,在前的标签优先处理
//因为如果在后的标签处理完,index就定下来,再处理在前的,后面的index就会产生偏移量。从前开始处理不会存在这个问题
if(subPair[0] < supPair[0]) {
supFirst = false;
} else {
subFirst = false;
}
}
if (subPair != null && subFirst) {
s = removeNextSubTags(s, SUB_START);
//标签被去掉之后,结束标签需要相应往前移动
subPair[1] = subPair[1] - SUB_START.length();
subs.add(subPair);
continue;
}
if (supPair != null) {
s = removeNextSubTags(s, SUP_START);
//标签被去掉之后,结束标签需要相应往前移动
supPair[1] = supPair[1] - SUP_START.length();
sups.add(supPair);
continue;
}
break;
}
tagIndexList.add(subs);
tagIndexList.add(sups);
return s;
}
hssfrow 单元格样式_POI实现上标下标和单元格部分样式修改相关推荐
- hssfrow 单元格样式_poi的各种单元格样式以及一些常用的配置
之前我做过一个poi到处excel数据的博客,但是,后面使用起来发现,导出的数据单元格样式都不对. 很多没有居中对齐,很多单元格的格式不对,还有就是单元格的大小不对,导致数据显示异常,虽然功能可以使用 ...
- EasyExcel 设置字体样式(字体、字体大小、字体颜色、字体加粗、字体斜体、字体下划线、字体上标下标、字体删除线)
1 Maven配置 <!--hutool工具包--><dependency><groupId>cn.hutool</groupId><artifa ...
- vue导出excel表格,使用xlsx-style自定义字体样式,字体颜色,合并单元格,单元格填充色
一.需要依赖 npm install xlsx-style --save "^0.8.13" npm install xlsx --save "^0.18.5" ...
- poi设置word表格单元格宽度_poi导出word表格的操作讲解
一.效果如下 二.js代码 function export_word(){ //导出word var url = "czzsca/exportWord.do"; this.expo ...
- html上标下标标签 示例_带有示例HTML th表标题标签教程
html上标下标标签 示例 HTML provides table structure which consists of rows, columns or cells. During the cre ...
- 【openpyxl】操作单元格,获取单个或多个单元格并修改数据、合并单元格、删除行列、移动单元格
1.获取和修改单个单元格 from openpyxl import Workbook wb = Workbook() ws = wb.activecell = ws["a6"] # ...
- php单元格字体颜色,PHPExcel API接口用法大全,按模板导入excel,美化excel,导出图片,设置单元格字体颜色背景色边框,合并单元格,设置行高列宽...
PHPExcel API接口用法大全,按模板导入excel,美化excel,导出图片,设置单元格字体颜色背景色边框,合并单元格,设置行高列宽 2020-08-31 85 一:读取excel表模板$ph ...
- a上标3下标6算法_a上标3下标6算法_Word中同时设置上标下标
我们在使用Word文档的时候,经常要输入上下标,我们在这里总结一下,以后再遇到就不发愁咯. 0,瞒天过海 此方法不推荐,但是我遇到有人这样过,发出来让大家看一下. 猜猜看哪个是标准的,另个是怎么做出来 ...
- vue中使用xlsx导出Excel 并设置样式,解决未完全合并单元格框线的BUG
今天有需到一个需求,需要在前端直接导出表格,将了解发现了npm上用的比较多的 xlsx 这个包,但是在使用过程中发现很多问题,下边是我将发现问题进行的汇总以及相应的解决办法. 1.安装 首先说安装问题 ...
最新文章
- tm matlab,[转载]关于matlab中textread
- html百度地图标记图标,百度地图开发之点击地图给该位置添加标注(图标)并弹出对应的位置...
- python 自定义模块怎么用_python自定义模块使用说明
- 教程Xcode 4下编译发布与提交App到AppStore
- Spring及SpringBoot @Async配置步骤及注意事项
- 比起第一代,《最后生还者2》到底做错了什么?
- centos 7 构造iptables开放80port
- 双主双从(2m-2s)集群介绍和工作流程说明
- windows 文件对话框
- 基于webview的选择滑动控件(PC和wap版)
- Bugku-Web-xxx二手交易市场
- 象棋名手手机版2019最新版_象棋名手326手机版-象棋名手增强版v6.58 安卓版-单机手游网...
- xp java环境_XP系统怎么安装JAVA编程环境
- velocity 语法简记
- python编写代码自动运行程序_利用Python编写自动打开指定软件的程序
- 软件测试面试题整理(四)之接口测试篇
- 车牌识别系统 HY-LPR2
- PHP语言系列API接口,按关键词搜索商品列表
- Vue脚手架、镜像源下载及使用
- ssm 远程监控linux,Wisenet SSM视频监控综合管理平台