在Android读取Word文件时,在网上查看时可以用tm-extractors,但好像没有提到怎么读取Word文档中字体的颜色,字体,上下标等相关的属性。但由于需要,要把doc文档中的内容(字体,下划线,颜色等)读取应用到android中(不包括图片和图表)。

后面采用的是poi三方jar包(原包太大,可以从源代码里自己抽取有用的一些代码减少包的大小)。

我的想法是:把doc中的内容解析出来后,加上html对应的标签,在android中通过Html.fromHtml在TextView中进行显示,或者通过WebView.loadData进行加载显示

但测试后,发现如果加载太多内容的话,在Android中效率不行。

效果(该图的效果是在TextView中的效果,在WebView中效果会更好些):

doc图:

android图:

做法1:(解析为span样式的,这种做法只能用WebView方式加载,Html.fromHtml无效)

Java代码  

/**Span样式

* 通过字体的样式进行加载

* @param inputStream

* @return

*/

public static String readDocToSpanByRun(InputStream inputStream) {

HWPFDocument hwpfDocument = null;

if(inputStream == null)

throw new RuntimeException("inputStream is null ...");

try{

hwpfDocument = new HWPFDocument(inputStream);

}catch(Exception e) {

throw new RuntimeException("HWPFDocment Exception", e);

}

Range allRange = hwpfDocument.getRange();

int length = allRange.numCharacterRuns();

StringBuffer sb = new StringBuffer();

CharacterRun cur;

String text = "";

for (int i = 0; i

cur = allRange.getCharacterRun(i);

sb.append(CharacterRunUtils.toSpanType(cur));

text = CharacterRunUtils.getSpicalSysbomByRun(cur.text());

if(cur.getSubSuperScriptIndex() == 1)

sb.append("").append(text).append("");

else if(cur.getSubSuperScriptIndex() == 2)

sb.append("").append(text).append("");

else

sb.append(text);

sb.append("");

}

return sb.toString();

}

做法2:(解析为font样式的,Html.fromHtml有效,但对应size的设置无效果)

Java代码  

/**

* Html样式

* 通过字体样式解析

* @param inputStream

* @return

*/

public static String readDocToHtml(InputStream inputStream) {

HWPFDocument hwpfDocument = null;

if(inputStream == null)

throw new RuntimeException("inputStream is null ...");

try{

hwpfDocument = new HWPFDocument(inputStream);

}catch(Exception e) {

throw new RuntimeException("HWPFDocment Exception", e);

}

CharacterRun  cur = null;

StringBuffer sb = new StringBuffer();

StringBuffer charStr =  new StringBuffer();

Range allRange = hwpfDocument.getRange();

for(int i = 0; i

cur = allRange.getCharacterRun(i);

sb.append(CharacterRunUtils.fontFaceColorSizeToHtml(cur));

charStr.append(CharacterRunUtils.toSupOrSub(cur, CharacterRunUtils.getSpicalSysbomByRun(cur.text())));

if(cur.isBold())  {

charStr.insert(0, "");

charStr.insert(charStr.length(), "");

}

if(cur.getUnderlineCode() != 0) {

charStr.insert(0, "");

charStr.insert(charStr.length(), "");

}

if(cur.isItalic()) {

charStr.insert(0, "");

charStr.insert(charStr.length(), "");

}

if(cur.isStrikeThrough()) {

charStr.insert(0, "");

charStr.insert(charStr.length(), "");

}

sb.append(charStr).append("");

charStr.setLength(0);

}

hwpfDocument = null;

return sb.toString();

}

以下是会用到的方法:

Java代码  

/**

*处理字体相关的属性

*/

public class CharacterRunUtils {

private static final short ENTER_ASCII = 13;

private static final short SPACE_ASCII = 32;

private static final short TABULATION_ASCII = 9;

/**

* 比对字体是否相同

* 可以继续加其它属性

* @param cr1

* @param cr2

* @return

*/

public static boolean compareCharStyleForSpan(CharacterRun cr1,

CharacterRun cr2) {

return cr1.isBold() == cr2.isBold()

&& cr1.getFontName().equals(cr2.getFontName())

&& cr1.getFontSize() == cr2.getFontSize()

&& cr1.isItalic() == cr2.isItalic()

&& cr1.getColor() == cr2.getColor()

&& cr1.getUnderlineCode() == cr2.getUnderlineCode()

&& cr1.isStrikeThrough() == cr2.isStrikeThrough()

&& cr1.getColor() == cr2.getColor();

}

public static boolean compareCharColor(CharacterRun cr1, CharacterRun cr2) {

return cr1.getFontName().equals(cr2.getFontName())

&& cr1.getFontSize() == cr2.getFontSize()

&& cr1.getColor() == cr2.getColor();

}

public static String getSpicalSysbom(char currentChar) {

String tempStr = "";

if (currentChar == ENTER_ASCII) {

tempStr += "
";

} else if (currentChar == SPACE_ASCII) {

tempStr += " ";

} else if (currentChar == TABULATION_ASCII) {

tempStr += "   ";

} else {

tempStr += currentChar;

}

return tempStr;

}

public static String getSpicalSysbomSpan(char currentChar) {

String tempStr = "";

if (currentChar == ENTER_ASCII) {

tempStr += "
";

} else if (currentChar == SPACE_ASCII) {

tempStr += " ";

} else if (currentChar == TABULATION_ASCII) {

tempStr += "   ";

}

return tempStr;

}

/**

* 特殊字符的取代

* @param currentChar

* @return

*/

public static String getSpicalSysbomByRun(String currentChar) {

StringBuffer tempStr = new StringBuffer();

int length = currentChar.length();

for (int i = 0; i

tempStr.append(getSpicalSysbom(currentChar.charAt(i)));

}

return tempStr.toString();

}

/**

* span方式前缀

* @param cr

* @return

*/

public static String toSpanType(CharacterRun cr) {

StringBuffer spanStyle = new StringBuffer("

spanStyle.append(cr.getFontName()).append("; font-size:")

.append(cr.getFontSize() / 2).append("pt;");

if (cr.isBold())

spanStyle.append("font-weight:bold;");

if (cr.isItalic())

spanStyle.append("font-style:italic;");

if (cr.isStrikeThrough())

spanStyle.append("text-decoration:line-through;");

if (cr.getUnderlineCode() != 0)

spanStyle.append("text-decoration:underline;");

spanStyle.append("color:")

.append(ColorUtils.getHexColor(cr.getIco24())).append(";")

.append("‘>");

return spanStyle.toString();

}

/**

* 为font方式提供

* @param cr

* @return

*/

public static String fontFaceColorSizeToHtml(CharacterRun cr) {

StringBuffer htmlType = new StringBuffer("

htmlType.append("size=‘").append(cr.getFontSize() / 2).append("‘ ")

.append("face=‘").append(cr.getFontName()).append("‘ ")

.append("color=‘")

.append(ColorUtils.getHexColor(cr.getIco24())).append("‘>");

return htmlType.toString();

}

/**

* 处理上下标

* @param cr

* @param currentChar

* @return

*/

public static String toSupOrSub(CharacterRun cr, String currentChar) {

int sub = cr.getSubSuperScriptIndex();

if (sub != 0) {

if (sub == 1)

// 上标

return "" + currentChar + "";

else

// 下标

return "" + currentChar + "";

} else

return currentChar;

}

public static String toSupOrSub(CharacterRun cr, char currentChar) {

return toSupOrSub(cr, new String(new char[]{currentChar}));

}

}

用到的颜色的转换(进行简单的颜色转换)

Java代码  

public class ColorUtils {

public static int  red(int c) {

return c & 0XFF;

}

public static int green(int c) {

return (c >> 8) & 0XFF;

}

public static int blue(int c) {

return (c >> 16) & 0XFF;

}

public static int rgb(int c) {

return (red(c) <

}

public static String rgbToSix(String rgb) {

int length = 6 - rgb.length();

String str = "";

while(length > 0){

str += "0";

length--;

}

return str + rgb;

}

public static String getHexColor(int color) {

color = color == -1 ? 0 : color;

int rgb = rgb(color);

return "#" + rgbToSix(Integer.toHexString(rgb));

}

}

java读取word文件并设置其字体样式_Java读取word文件,字体,颜色(示例代码)相关推荐

  1. html字体字号颜色怎么设置,html字体样式大全 html怎么改变字体大小和颜色

    网页字体样式华文黑体:STHeiti 网页字体样式华文楷体:STKaiti 网页字体样式华文宋体:STSong 网页字体样式华文仿宋:STFangsong 网页字体样式黑体:SimHei 网页字体样式 ...

  2. Adobe Acrobat 无法打开文件附件,因为您的PDF文件附件设置不允许打开本类型的文件

    问题说明 PDF 中添加了附件,然后无法打开,右键保存自然也不可能保存了. 具体弹框提示如下: Adobe Acrobat 无法打开文件附件,因为您的PDF文件附件设置不允许打开本类型的文件. 解决方 ...

  3. html5 字体位置,html5字体样式 移动 html5 中文什么字体

    网页字体样式华文黑体:STHeiti 网页字体样式华文楷体:STKaiti 网页字体样式华文宋体:STSong 网页字体样式华文仿宋:STFangsong 网页字体样式黑体:SimHei 网页字体样式 ...

  4. oracle修改字体样式,电脑系统字体样式怎么改?电脑字体样式更改方法

    喜欢个性化电脑的朋友经常会想更改系统的一些默认设置,比如窗口动画.主题.或字体等等,总之要让我们看电脑时比较符合自己的口味才行哈,这里说明下如何更改系统显示的字体,包括图标下面的字体.右键菜单等等. ...

  5. phpexcel_cell 获取表格样式_Java 操作Word表格——创建嵌套表格、添加/复制表格行或列、设置表格是否禁止跨页断行...

    精品推荐 国内稀缺优秀Java全栈课程-Vue+SpringBoot通讯录系统全新发布! Docker快速手上视频教程(无废话版)[免费] 作者:E-iceblue https://www.cnblo ...

  6. 设置字体样式:字号大小,字体种类,字体粗细

    font-size:字号大小 font-size属性用于设置字号,该属性的值可以使用相对长度单位,也可以使用绝对长度单位,其中,相对长度单位比较常用,推荐使用像素单位px,绝对长度单位使用较少.具体如 ...

  7. php如何导入字体样式,css怎么引入外部字体?css 字体样式设置的方法(实例)...

    在浏览器显示中,页面上不同的字体样式,不仅提升了页面的美观度,也提升了用户的浏览交互性.那么这些不同的字体样式是怎么用css设置的?本章就给大家带来css如何引入外部字体?css 字体样式设置的方法( ...

  8. ExcelJs导出Excel文件并设置单元格样式

    下载exceljs并引入 数据源格式:二维数组,null值是后面要合并单元格的,占个位置. //创建对象 var wb = new ExcelJS.Workbook(); //创建一个名称为Sheet ...

  9. 太激动!Android修改全局字体样式,替换整个APP字体

    最近一直在如何全局修改app字体上困惑着,今天终于有了突破.我将搜集的资料进行了整理,现在提供给大家. 前面为分析,建议直接翻到最后看[个人中心设置]. 参考链接: Android应用使用自定义字体 ...

最新文章

  1. php 返回字符串给aja,解决ajax异步请求返回的是字符串问题
  2. 怎样看待大学期间的代码练习
  3. codevs1251 括号
  4. codeforces 665B Shopping
  5. C++虚继承和虚基类详解(一)
  6. 首届UBDC全域大数据峰会:未来的数据一定是全域数据
  7. C/C++ | 字节对齐
  8. 爬虫爬到的网页源代码不是真正的源代码_Python爬虫经常爬不到数据?你可以看一下这篇文章...
  9. java 懒加载模式_JavaScript面试系列:JavaScript设计模式之桥接模式和懒加载
  10. PLSQL Developer报“动态执行表不可访问,本会话的自动统计被禁止”的解决方案...
  11. php上传文件插件怎么用,使用jquery-fileupload上传插件
  12. The King’s Problem 强连通
  13. 7个和尚_一位高僧对世俗问题的7个回答,非常绝妙!
  14. Python3使用bencode库解析BT种子
  15. retroarch游戏模拟器使用
  16. 8051单片机Proteus仿真与开发实例-74HC573锁存器驱动仿真
  17. carsim/trucksim获取轮胎侧偏刚度、纵向刚度
  18. ghost还原固态硬盘_不要Ghost和重装 两招把Win7克隆到SSD
  19. 随机事件和概率及概率的性质
  20. 绘制森林资源图的工具介绍

热门文章

  1. 硬件:Nand Flash、Nor Flash
  2. 孙鑫老师VC笔记(转)
  3. 检测按键正确的小游戏
  4. 关于防止游戏行为检测的几点建议技巧
  5. python多个函数_请教:一个类中可以定义多个同名函数?
  6. 女巫的魔法-第12届蓝桥杯Scratch省赛3真题第2题
  7. SAP—IDoc操作步骤
  8. java 上传csv/xslx文件,预览,导入到数据库中
  9. xorg方式在无图形环境安装oracle,告别静默安装
  10. 暴力破解工具 hydra