10
回答
Java导出Word问题
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

最近在做导出 word 功能,我采用的方法是:

使用 freemarker 生成含有数据的完整的 html文件,使用POI保存为doc文件,生成的doc文件可以正常打开,但是发现:

1. 生成的doc文件不分页,是一个整体

2. 更头疼的是:在本地对生成的doc文件进行编辑,保存后会跟随多生成一个 xx.files 目录,里面放置一些文件;

不知道大家有没有做过导出 word 功能的,我要导出的word带有表格等信息

举报
山哥
发帖于7年前 10回/5K+阅
共有10个答案 最后回答: 1年前

饿 本来这里不该说,不过你可以尝试用一下aspose.word.for.java,不开源,不免费,单认证价格$8000

LS的,这个显然不是LZ想要的解决之道~哈哈哈~

不过确实没有用POI操作过word,一直都是操作excel,等着看看有没有用过的通知给指点指点,俺也跟着学学~

LS的知道为什么吗?

当时做excel和word表格到入数据库,我用POI死的心都有了,POI的word是做的最好的,但是现在作者好像被微软收编了,已不再更新,而aspose用的就很方便。

饿,我绝对不是在推销aspose

引用来自#6楼“袁柯”的帖子

我用的是 jxl操作 word,很方便的, 档主可以试一试

? jxl都是用来操作Excel的,我用过 jxl 导出excel的,但是 jxl 能操作word吗??

Java Excel API - A Java API to read, write and modify Excel spreadsheets

用jxl吧,简单易用,我天天做报表,jxl、poi、jacob都用过,不过还是jxl用着最方便最省事,一般的需求完全可以满足了

Java导出Word最好还是选用专业产品,不管是POI还是JXL都不是调用的Office原生接口生成的文件格式多半会有问题,我自己就试过,模板稍微调整生成的文件内容就错乱了,搞的头都大了,后来买了一个第三方的产品PageOffice,集成简单,功能也不弱,推荐参考一下www.zhuozhengsoft.com,下载中心有免费试用的开发包。
一群广告,java导出word直接调用windows的com组件提供的服务就好,poi还不如openoffice,opencoffice不如微软的自己的com组件。不过这个方案需要一台windows服务器。
//使用的是Apache POI
public static String readWord(InputStream ins)throws Exception
    {
    	StringBuffer sRet=new StringBuffer();
    	byte[] bContent = null;
        ByteArrayOutputStream outs = null;
        byte[] head = new byte[8];
        byte[] bHead = new byte[] {-48, -49, 17, -32, -95, -79, 26, -31};
        boolean bFlag = false;
        ByteArrayInputStream bis=null;
        try {
        	if(ins==null)
        	{
        		throw new Exception("文件流不存在!");
        	}
			outs = new ByteArrayOutputStream();
			bContent = new byte[2048];
			int j = -1;
			while ((j = ins.read(bContent)) != -1)
			{
			    outs.write(bContent, 0, j);
			}
			outs.flush();
			bContent = outs.toByteArray();
			outs.close();
			
			for (int i = 0; i < head.length; i++)
            {
                if (bContent[i] != bHead[i])
                {
                    bFlag = true;
                    break;
                }
            }
			bis=new ByteArrayInputStream(bContent);

            if (bFlag)//word 2007
            {
            	XWPFParagraph xph=null;
            	XWPFDocument document = new XWPFDocument(bis);
                /** 操作Word段落begin */
                Iterator<XWPFParagraph> it = document.getParagraphsIterator();
                while (it.hasNext())
                {
                    xph = it.next();
                    sRet.append(xph.getParagraphText()+"\n");
                }
            }
            else//word2003
            {
            	HWPFDocument document = new HWPFDocument(bis);
            	Range bodyRange = document.getRange();
            	Paragraph ph=null;
            	// 段落
                for (int h = 0; h < bodyRange.numParagraphs(); h++)
                {
                    ph = bodyRange.getParagraph(h);
                    sRet.append(ph.text());
                }
            }
            
		} catch (Exception e) {
			throw e;
		}finally
		{
			outs.close();
		}
    	return sRet.toString();
    }



顶部