java 显示word文档_如何通过apache POI技术来读取Word文档,并把Word文档的原来格式完整地显示在html网页?...

我把代码发到你的邮箱。

package com.my.util;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import org.apache.poi.hwpf.HWPFDocument;

import org.apache.poi.hwpf.model.PicturesTable;

import org.apache.poi.hwpf.usermodel.CharacterRun;

import org.apache.poi.hwpf.usermodel.Paragraph;

import org.apache.poi.hwpf.usermodel.Picture;

import org.apache.poi.hwpf.usermodel.Range;

import org.apache.poi.hwpf.usermodel.Table;

import org.apache.poi.hwpf.usermodel.TableCell;

import org.apache.poi.hwpf.usermodel.TableIterator;

import org.apache.poi.hwpf.usermodel.TableRow;

public class WordExcelToHtml1 {

/**

* 回车符ASCII码

*/

private static final short ENTER_ASCII = 13;

/**

* 空格符ASCII码

*/

private static final short SPACE_ASCII = 32;

/**

* 水平制表符ASCII码

*/

private static final short TABULATION_ASCII = 9;

public static String htmlText = "";

public static String htmlTextTbl = "";

public static int counter = 0;

public static int beginPosi = 0;

public static int endPosi = 0;

public static int beginArray[];

public static int endArray[];

public static String htmlTextArray[];

public static boolean tblExist = false;

public static final String inputFile = "c://cc.doc";

public static void main(String argv[]) {

try {

getWordAndStyle(inputFile);

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 读取每个文字样式

*

* @param fileName

* @throws Exception

*/

public static void getWordAndStyle(String fileName) throws Exception {

FileInputStream in = new FileInputStream(new File(fileName));

HWPFDocument doc = new HWPFDocument(in);

Range rangetbl = doc.getRange();// 得到文档的读取范围

TableIterator it = new TableIterator(rangetbl);

int num = 100;

beginArray = new int[num];

endArray = new int[num];

htmlTextArray = new String[num];

// 取得文档中字符的总数

int length = doc.characterLength();

// 创建图片容器

PicturesTable pTable = doc.getPicturesTable();

htmlText = "

"

+ doc.getSummaryInformation().getTitle()

+ "

";

// 创建临时字符串,好加以判断一串字符是否存在相同格式

if (it.hasNext()) {

readTable(it, rangetbl);

}

int cur = 0;

String tempString = "";

for (int i = 0; i < length - 1; i++) {

// 整篇文章的字符通过一个个字符的来判断,range为得到文档的范围

Range range = new Range(i, i + 1, doc);

CharacterRun cr = range.getCharacterRun(0);

if (tblExist) {

if (i == beginArray[cur]) {

htmlText += tempString + htmlTextArray[cur];

tempString = "";

i = endArray[cur] - 1;

cur++;

continue;

}

}

if (pTable.hasPicture(cr)) {

htmlText += tempString;

// 读写图片

readPicture(pTable, cr);

tempString = "";

} else {

Range range2 = new Range(i + 1, i + 2, doc);

// 第二个字符

CharacterRun cr2 = range2.getCharacterRun(0);

char c = cr.text().charAt(0);

System.out.println(i + "::" + range.getEndOffset() + "::"

+ range.getStartOffset() + "::" + c);

// 判断是否为回车符

if (c == ENTER_ASCII) {

tempString += "
";

}

// 判断是否为空格符

else if (c == SPACE_ASCII)

tempString += " ";

// 判断是否为水平制表符

else if (c == TABULATION_ASCII)

tempString += "    ";

// 比较前后2个字符是否具有相同的格式

boolean flag = compareCharStyle(cr, cr2);

if (flag)

tempString += cr.text();

else {

String fontStyle = "

if (cr.isBold())

fontStyle += "font-weight:bold;";

if (cr.isItalic())

fontStyle += "font-style:italic;";

htmlText += fontStyle;

if (cr.isBold())

fontStyle += "font-weight:bold;";

if (cr.isItalic())

fontStyle += "font-style:italic;";

htmlText += fontStyle;

tempString = "";

}

}

}

htmlText += tempString + "";

writeFile(htmlText);

}

/**

* 读写文档中的表格

*

* @param pTable

* @param cr

* @throws Exception

*/

public static void readTable(TableIterator it, Range rangetbl)

throws Exception {

htmlTextTbl = "";

// 迭代文档中的表格

counter = -1;

while (it.hasNext()) {

tblExist = true;

htmlTextTbl = "";

Table tb = (Table) it.next();

beginPosi = tb.getStartOffset();

endPosi = tb.getEndOffset();

counter = counter + 1;

// 迭代行,默认从0开始

beginArray[counter] = beginPosi;

endArray[counter] = endPosi;

htmlTextTbl += "

for (int i = 0; i < tb.numRows(); i++) {

TableRow tr = tb.getRow(i);

htmlTextTbl += "

";

// 迭代列,默认从0开始

for (int j = 0; j < tr.numCells(); j++) {

TableCell td = tr.getCell(j);// 取得单元格

int cellWidth = td.getWidth();

// 取得单元格的内容

for (int k = 0; k < td.numParagraphs(); k++) {

Paragraph para = td.getParagraph(k);

String s = para.text().toString().trim();

if (s == "") {

s = " ";

}

htmlTextTbl += "

" + s

+ "

";

}

}

}

htmlTextTbl += "

";

htmlTextArray[counter] = htmlTextTbl;

}

}

/**

* 读写文档中的图片

*

* @param pTable

* @param cr

* @throws Exception

*/

public static void readPicture(PicturesTable pTable, CharacterRun cr)

throws Exception {

// 提取图片

Picture pic = pTable.extractPicture(cr, false);

// 返回POI建议的图片文件名

String afileName = pic.suggestFullFileName();

File file = null;

if (StringUtilx.isNotEmpty(afileName)) {

file = new File("c://test" + File.separator + afileName);

}

if (file != null) {

if (!file.exists()) {

file.createNewFile();

}

OutputStream out = new FileOutputStream(file);

pic.writeImageContent(out);

            htmlText += "";

}

}

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

boolean flag = false;

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

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

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

flag = true;

}

return flag;

}

/**

* 写文件

*

* @param s

*/

public static void writeFile(String s) {

FileOutputStream fos = null;

BufferedWriter bw = null;

try {

File file = new File("c://abc.html");

fos = new FileOutputStream(file);

bw = new BufferedWriter(new OutputStreamWriter(fos));

bw.write(s);

} catch (FileNotFoundException fnfe) {

fnfe.printStackTrace();

} catch (IOException ioe) {

ioe.printStackTrace();

} finally {

try {

if (bw != null)

bw.close();

if (fos != null)

fos.close();

} catch (IOException ie) {

}

}

}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值