![【移動應(yīng)用開發(fā)技術(shù)】Android怎么使用模板生成支持手機直接查看的Word文檔_第1頁](http://file4.renrendoc.com/view/58d23fcc01f7e87d5fb8dfb6a8936505/58d23fcc01f7e87d5fb8dfb6a89365051.gif)
![【移動應(yīng)用開發(fā)技術(shù)】Android怎么使用模板生成支持手機直接查看的Word文檔_第2頁](http://file4.renrendoc.com/view/58d23fcc01f7e87d5fb8dfb6a8936505/58d23fcc01f7e87d5fb8dfb6a89365052.gif)
![【移動應(yīng)用開發(fā)技術(shù)】Android怎么使用模板生成支持手機直接查看的Word文檔_第3頁](http://file4.renrendoc.com/view/58d23fcc01f7e87d5fb8dfb6a8936505/58d23fcc01f7e87d5fb8dfb6a89365053.gif)
![【移動應(yīng)用開發(fā)技術(shù)】Android怎么使用模板生成支持手機直接查看的Word文檔_第4頁](http://file4.renrendoc.com/view/58d23fcc01f7e87d5fb8dfb6a8936505/58d23fcc01f7e87d5fb8dfb6a89365054.gif)
![【移動應(yīng)用開發(fā)技術(shù)】Android怎么使用模板生成支持手機直接查看的Word文檔_第5頁](http://file4.renrendoc.com/view/58d23fcc01f7e87d5fb8dfb6a8936505/58d23fcc01f7e87d5fb8dfb6a89365055.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
【移動應(yīng)用開發(fā)技術(shù)】Android怎么使用模板生成支持手機直接查看的Word文檔
在下給大家分享一下Android怎么使用模板生成支持手機直接查看的Word文檔,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!最近在項目工作中,碰到一個很棘手的需求,說是要在手機端根據(jù)模板生成word文檔,而且不借助第三方的軟件可以查看word文檔,一開始聽這個需求差不多蒙了,這要怎么做,為什么不把生成word文檔這個工作放在后臺呢,抱怨歸抱怨,但是面對需求只能硬著頭皮做了,經(jīng)過各種拷問度娘和谷哥,終于找了一個比較好用的方法。特此跟他家分享。Apache公司推出的ApachePOI,我們來看下他的介紹:ApachePOI是用Java編寫的免費開源的跨平臺的JavaAPI,ApachePOI提供API給Java程式對MicrosoftOffice格式檔案讀和寫的功能。首先我們要下ApachePOI的開發(fā)jar包,下載地址,這里推薦不要下最新版本的,因為一開始我用最新版本的會出一下莫名其妙的問題,后面換舊的版本就OK了。這里我用的是3.9的還是比較穩(wěn)定的、開發(fā)有2個包,有一點我就非常郁悶Apache居然沒有提供api穩(wěn)定,開發(fā)起來還是比較蛋疼的,可能是我自己沒有找到把,如果有知道的筒子可以@我、嘿嘿。不過Apache還是提供了Demo大家可以參考。還有我們要準備我們使用的word模板文件、這里我們放在了assets下面了。首先我們來看看怎么使用模板:package
com.test.poiword;
import
android.app.Activity;
import
android.content.ActivityNotFoundException;
import
android.content.Intent;
import
.Uri;
import
android.os.Bundle;
import
android.view.View;
import
android.view.View.OnClickListener;
import
android.widget.Button;
import
android.widget.Toast;
import
com.test.poiword.utils.FileUtils;
import
org.apache.poi.hwpf.HWPFDocument;
import
org.apache.poi.hwpf.usermodel.Range;
import
java.io.ByteArrayOutputStream;
import
java.io.File;
import
java.io.FileInputStream;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
java.io.InputStream;
import
java.util.HashMap;
import
java.util.Map;
public
class
MainActivity
extends
Activity
{
//
模板文集地址
private
static
final
String
demoPath
=
"/mnt/sdcard/doc/test.doc";
//
創(chuàng)建生成的文件地址
private
static
final
String
newPath
=
"/mnt/sdcard/doc/testS.doc";
private
Button
btn,btns;
@Override
protected
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=(Button)findViewById(R.id.btn);
btns=(Button)findViewById(R.id.btns);
btn.setOnClickListener(new
OnClickListener()
{
@Override
public
void
onClick(View
arg0)
{
try
{
InputStream
inputStream
=
getAssets().open("test.doc");
FileUtils.writeFile(new
File(demoPath),
inputStream);
}
catch
(Exception
e)
{
e.printStackTrace();
}
doScan();
}
});
btns.setOnClickListener(new
OnClickListener()
{
@Override
public
void
onClick(View
arg0)
{
Intent
intent
=
new
Intent(MainActivity.this,WordHtmlActivity.class);
startActivity(intent);
}
});
}
private
void
doScan(){
//獲取模板文件
File
demoFile=new
File(demoPath);
//創(chuàng)建生成的文件
File
newFile=new
File(newPath);
Map<String,
String>
map
=
new
HashMap<String,
String>();
map.put("$QYMC$",
"xxx科技股份有限公司");
map.put("$QYDZ$",
"上海市楊浦區(qū)xx路xx號");
map.put("$QYFZR$",
"張三");
map.put("$FRDB$",
"李四");
map.put("$CJSJ$",
"2000-11-10");
map.put("$SCPZMSJWT$",
"5");
map.put("$XCJCJBQ$",
"6");
map.put("$JLJJJFF$",
"7");
map.put("$QYFZRQM$",
"張三");
map.put("$CPRWQM$",
"趙六");
map.put("$ZFZH$",
"100001");
map.put("$BZ$",
"無");
writeDoc(demoFile,newFile,map);
//查看
doOpenWord();
}
/**
*
調(diào)用手機中安裝的可打開word的軟件
*/
private
void
doOpenWord(){
Intent
intent
=
new
Intent();
intent.setAction("ent.action.VIEW");
intent.addCategory("ent.category.DEFAULT");
String
fileMimeType
=
"application/msword";
intent.setDataAndType(Uri.fromFile(new
File(newPath)),
fileMimeType);
try{
MainActivity.this.startActivity(intent);
}
catch(ActivityNotFoundException
e)
{
//檢測到系統(tǒng)尚未安裝OliveOffice的apk程序
Toast.makeText(MainActivity.this,
"未找到軟件",
Toast.LENGTH_LONG).show();
//請先到/e.apk下載并安裝
}
}
/**
*
demoFile
模板文件
*
newFile
生成文件
*
map
要填充的數(shù)據(jù)
*
*/
public
void
writeDoc(File
demoFile
,File
newFile
,Map<String,
String>
map)
{
try
{
FileInputStream
in
=
new
FileInputStream(demoFile);
HWPFDocument
hdt
=
new
HWPFDocument(in);
//
Fields
fields
=
hdt.getFields();
//
讀取word文本內(nèi)容
Range
range
=
hdt.getRange();
//
System.out.println(range.text());
//
替換文本內(nèi)容
for(Map.Entry<String,
String>
entry
:
map.entrySet())
{
range.replaceText(entry.getKey(),
entry.getValue());
}
ByteArrayOutputStream
ostream
=
new
ByteArrayOutputStream();
FileOutputStream
out
=
new
FileOutputStream(newFile,
true);
hdt.write(ostream);
//
輸出字節(jié)流
out.write(ostream.toByteArray());
out.close();
ostream.close();
}
catch(IOException
e)
{
e.printStackTrace();
}
catch(Exception
e)
{
e.printStackTrace();
}
}
}上面代碼的代碼并不多,首先我們要注意的是我們使用的poi的api大部分是在org.apache.poi.hwpf下面的,大家不要導(dǎo)錯包了,因為apache每個包對應(yīng)的內(nèi)容不同:上面代碼不難懂,就是把我們要放的內(nèi)容使用特定的代號組裝一個map塞到我們的模板里面去,然后重新存儲下,不過我們模板也要使用相同的代號、poi才能識別:這樣我們就使用模板大功告成了,就可以查看了、但是有些手機并沒有裝wps類似的工具,要是手機可以直接查看那就好了,嘿嘿、當然apache肯定也想到了、提供了這樣的api下面上代碼:package
com.test.poiword;
import
android.os.Bundle;
import
android.support.v4.app.FragmentActivity;
import
android.webkit.WebSettings;
import
android.webkit.WebView;
import
com.test.poiword.utils.FileUtils;
import
org.apache.poi.hwpf.HWPFDocument;
import
org.apache.poi.hwpf.converter.PicturesManager;
import
org.apache.poi.hwpf.converter.WordToHtmlConverter;
import
org.apache.poi.hwpf.usermodel.Picture;
import
org.apache.poi.hwpf.usermodel.PictureType;
import
org.w3c.dom.Document;
import
java.io.BufferedWriter;
import
java.io.ByteArrayOutputStream;
import
java.io.File;
import
java.io.FileInputStream;
import
java.io.FileNotFoundException;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
java.io.OutputStreamWriter;
import
java.util.List;
import
javax.xml.parsers.DocumentBuilderFactory;
import
javax.xml.transform.OutputKeys;
import
javax.xml.transform.Transformer;
import
javax.xml.transform.TransformerFactory;
import
javax.xml.transform.dom.DOMSource;
import
javax.xml.transform.stream.StreamResult;
/**
*
Created
by
fuweiwei
on
2015/11/28.
*/
public
class
WordHtmlActivity
extends
FragmentActivity
{
//文件存儲位置
private
String
docPath
=
"/mnt/sdcard/doc/";
//文件名稱
private
String
docName
=
"test.doc";
//html文件存儲位置
private
String
savePath
=
"/mnt/sdcard/doc/";
@Override
protected
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.html);
String
name
=
docName.substring(0,
docName.indexOf("."));
try
{
convert2Html(docPath
+
docName,
savePath
+
name
+
".html");
}
catch
(Exception
e)
{
e.printStackTrace();
}
//WebView加載顯示本地html文件
WebView
webView
=
(WebView)this.findViewById(R.id.office);
WebSettings
webSettings
=
webView.getSettings();
webSettings.setLoadWithOverviewMode(true);
webSettings.setSupportZoom(true);
webSettings.setBuiltInZoomControls(true);
webView.loadUrl("file:/"+savePath+name+".html");
}
/**
*
word文檔轉(zhuǎn)成html格式
*
*/
public
void
convert2Html(String
fileName,
String
outPutFile)
{
HWPFDocument
wordDocument
=
null;
try
{
wordDocument
=
new
HWPFDocument(new
FileInputStream(fileName));
WordToHtmlConverter
wordToHtmlConverter
=
new
WordToHtmlConverter(
DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument());
//設(shè)置圖片路徑
wordToHtmlConverter.setPicturesManager(new
PicturesManager()
{
public
String
savePicture(byte[]
content,
PictureType
pictureType,
String
suggestedName,
float
widthInches,
float
heightInches)
{
String
name
=
docName.substring(0,
docName.indexOf("."));
return
name
+
"/"
+
suggestedName;
}
});
//保存圖片
List<Picture>
pics=wordDocument.getPicturesTable().getAllPictures();
if(pics!=null){
for(int
i=0;i<pics.size();i++){
Picture
pic
=
(Picture)pics.get(i);
System.out.println(
pic.suggestFullFileName());
try
{
String
name
=
docName.substring(0,docName.indexOf("."));
String
file
=
savePath+
name
+
"/"
+
pic.suggestFullFileName();
FileUtils.makeDirs(file);
pic.writeImageContent(new
FileOutputStream(file));
}
catch
(FileNotFoundException
e)
{
e.printStackTrace();
}
}
}
wordToHtmlCcessDocument(wordDocument);
Document
htmlDocument
=
wordToHtmlConverter.getDocument();
ByteArrayOutputStream
out
=
new
ByteArrayOutputStream();
DOMSource
domSource
=
new
DOMSource(htmlDocument);
StreamResult
streamResult
=
new
StreamResult(out);
TransformerFactory
tf
=
TransformerFactory.newInstance();
Transformer
serializer
=
tf.newTransformer();
serializer.setOutputProperty(OutputKeys.ENCODING,
"utf-8");
serializer.setOutputProperty(OutputKeys.INDENT,
"yes");
seriali
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 創(chuàng)建理想課間休息環(huán)境的策略與實施路徑
- 教育評價體系改革的策略與實施路徑:深化改革的方向
- 推動成品油流通國際化發(fā)展的策略
- 2025屆山東省聊城市重點達標名校中考聯(lián)考生物試題含解析
- 2025屆廣州市白云區(qū)中考生物適應(yīng)性模擬試題含解析
- 酒店年會協(xié)議合同
- 2025屆山東省東營市河口區(qū)義和鎮(zhèn)中學(xué)心校中考生物五模試卷含解析
- 簡單附加協(xié)議合同范本
- 科技公司員工保密協(xié)議書
- 食用菌銷售合同
- 中國儲備糧管理集團有限公司蘭州分公司招聘筆試真題2024
- 武漢2025年湖北武漢理工大學(xué)管理人員招聘筆試歷年參考題庫附帶答案詳解
- 第1課 隋朝統(tǒng)一與滅亡 課件(26張)2024-2025學(xué)年部編版七年級歷史下冊
- 提高金剛砂地坪施工一次合格率
- 【歷史】唐朝建立與“貞觀之治”課件-2024-2025學(xué)年統(tǒng)編版七年級歷史下冊
- 基于護士主導(dǎo)的MDT肺康復(fù)管理模式改善肺部術(shù)后患者照護結(jié)局
- 產(chǎn)業(yè)園區(qū)招商合作協(xié)議書
- 2024年廣東省公務(wù)員錄用考試《行測》真題及答案解析
- 2025新譯林版英語七年級下單詞默寫表
- 2024-2025學(xué)年人教版八年級上冊數(shù)學(xué)期末專項復(fù)習:軸對稱(易錯必刷40題)解析版
- 2022年《國民經(jīng)濟行業(yè)分類》
評論
0/150
提交評論