急求POI 将数据导出到Word的实例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了急求POI 将数据导出到Word的实例相关的知识,希望对你有一定的参考价值。

将网页或后台处理数据通过POI导出到Word中,能够在导出中显示打开/保存对话框,有没有好的方案,最好有实例.
如果没有实例,点播一二也可.
先在此谢过
有满意答案被采纳可送全部积分

参考技术A import java.io.*;
import java.util.*;
import org.apache.poi.poifs.filesystem.*;
import org.apache.poi.util.LittleEndian;

public class WordTest
public WordTest()

public static boolean writeWordFile(String path, String content)
boolean w = false;
try

// byte b[] = content.getBytes("ISO-8859-1");
byte b[] = content.getBytes();

ByteArrayInputStream bais = new ByteArrayInputStream(b);

POIFSFileSystem fs = new POIFSFileSystem();
DirectoryEntry directory = fs.getRoot();

DocumentEntry de = directory.createDocument("WordDocument", bais);

FileOutputStream ostream = new FileOutputStream(path);

fs.writeFilesystem(ostream);

bais.close();
ostream.close();

catch (IOException e)
e.printStackTrace();

return w;

public static void main(String[] args)
boolean b = writeWordFile("E://test.doc","hello");


/*
public String extractText(InputStream in) throws IOException
ArrayList text = new ArrayList();
POIFSFileSystem fsys = new POIFSFileSystem(in);

DocumentEntry headerProps = (DocumentEntry) fsys.getRoot().getEntry("WordDocument");
DocumentInputStream din = fsys.createDocumentInputStream("WordDocument");
byte[] header = new byte[headerProps.getSize()];

din.read(header);
din.close();
// Prende le informazioni dall'header del documento
int info = LittleEndian.getShort(header, 0xa);

boolean useTable1 = (info & 0x200) != 0;

//boolean useTable1 = true;

// Prende informazioni dalla piece table
int complexOffset = LittleEndian.getInt(header, 0x1a2);
//int complexOffset = LittleEndian.getInt(header);

String tableName = null;
if (useTable1)
tableName = "1Table";
else
tableName = "0Table";


DocumentEntry table = (DocumentEntry) fsys.getRoot().getEntry(tableName);
byte[] tableStream = new byte[table.getSize()];

din = fsys.createDocumentInputStream(tableName);

din.read(tableStream);
din.close();

din = null;
fsys = null;
table = null;
headerProps = null;

int multiple = findText(tableStream, complexOffset, text);

StringBuffer sb = new StringBuffer();
int size = text.size();
tableStream = null;

for (int x = 0; x < size; x++)

WordTextPiece nextPiece = (WordTextPiece) text.get(x);
int start = nextPiece.getStart();
int length = nextPiece.getLength();

boolean unicode = nextPiece.usesUnicode();
String toStr = null;
if (unicode)
toStr = new String(header, start, length * multiple, "UTF-16LE");
else
toStr = new String(header, start, length, "ISO-8859-1");

sb.append(toStr).append(" ");


return sb.toString();


private static int findText(byte[] tableStream, int complexOffset, ArrayList text)
throws IOException
//actual text
int pos = complexOffset;
int multiple = 2;
//skips through the prms before we reach the piece table. These contain data
//for actual fast saved files
while (tableStream[pos] == 1)
pos++;
int skip = LittleEndian.getShort(tableStream, pos);
pos += 2 + skip;

if (tableStream[pos] != 2)
throw new IOException("corrupted Word file");
else
//parse out the text pieces
int pieceTableSize = LittleEndian.getInt(tableStream, ++pos);
pos += 4;
int pieces = (pieceTableSize - 4) / 12;
for (int x = 0; x < pieces; x++)
int filePos =
LittleEndian.getInt(tableStream, pos + ((pieces + 1) * 4) + (x *<img src="/images/forum/smiles/icon_cool.gif"/> + 2);
boolean unicode = false;
if ((filePos & 0x40000000) == 0)
unicode = true;
else
unicode = false;
multiple = 1;
filePos &= ~(0x40000000); //gives me FC in doc stream
filePos /= 2;

int totLength =
LittleEndian.getInt(tableStream, pos + (x + 1) * 4)
- LittleEndian.getInt(tableStream, pos + (x * 4));

WordTextPiece piece = new WordTextPiece(filePos, totLength, unicode);
text.add(piece);




return multiple;

public static void main(String[] args)
WordTest w = new WordTest();
POIFSFileSystem ps = new POIFSFileSystem();
try

File file = new File("C:\\test.doc");

InputStream in = new FileInputStream(file);
String s = w.extractText(in);
System.out.println(s);

catch(Exception e)
e.printStackTrace();



public boolean writeWordFile(String path, String content)
boolean w = false;
try

// byte b[] = content.getBytes("ISO-8859-1");
byte b[] = content.getBytes();

ByteArrayInputStream bais = new ByteArrayInputStream(b);

POIFSFileSystem fs = new POIFSFileSystem();
DirectoryEntry directory = fs.getRoot();

DocumentEntry de = directory.createDocument("WordDocument", bais);

FileOutputStream ostream = new FileOutputStream(path);

fs.writeFilesystem(ostream);

bais.close();
ostream.close();

catch (IOException e)
e.printStackTrace();


return w;




class WordTextPiece
private int _fcStart;
private boolean _usesUnicode;
private int _length;

public WordTextPiece(int start, int length, boolean unicode)
_usesUnicode = unicode;
_length = length;
_fcStart = start;

public boolean usesUnicode()
return _usesUnicode;


public int getStart()
return _fcStart;

public int getLength()
return _length;



*/

以上是关于急求POI 将数据导出到Word的实例的主要内容,如果未能解决你的问题,请参考以下文章

easypoi导出word表格怎么遍历数据

java poi导出数据为空,求解释

java工厂类 poi导出

java利用poi导出word文档

java利用poi导出word文档

数据导出生成word附件使用POI的XWPFTemplate对象