亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android使用模板生成支持手機直接查看的Word文檔

2019-10-21 21:32:41
字體:
來源:轉載
供稿:網友

最近在項目工作中,碰到一個很棘手的需求,說是要在手機端根據模板生成word文檔,而且不借助第三方的軟件可以查看word文檔,一開始聽這個需求差不多蒙了,這要怎么做,為什么不把生成word文檔這個工作放在后臺呢,抱怨歸抱怨,但是面對需求只能硬著頭皮做了,經過各種拷問度娘和谷哥,終于找了一個比較好用的方法。特此跟他家分享。

Apache 公司推出的 Apache POI,我們來看下他的介紹:Apache POI 是用Java編寫的免費開源的跨平臺的 Java API,Apache POI提供API給Java程式對Microsoft Office格式檔案讀和寫的功能。

廢話少說開始編碼,首先我們要下Apache POI的開發jar包,下載地址,這里推薦不要下最新版本的,因為一開始我用最新版本的會出一下莫名其妙的問題,后面換舊的版本就OK了。這里我用的是3.9的還是比較穩定的、

Android,模板,手機,Word

開發有2個包,有一點我就非常郁悶Apache居然沒有提供api穩定,開發起來還是比較蛋疼的,可能是我自己沒有找到把,如果有知道的筒子可以@我、嘿嘿。不過Apache還是提供了Demo大家可以參考。還有我們要準備我們使用的word模板文件、這里我們放在了assets下面了。首先我們來看看怎么使用模板:

package com.test.poiword; import android.app.Activity;import android.content.ActivityNotFoundException;import android.content.Intent;import android.net.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"; // 創建生成的文件地址 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); //創建生成的文件 File newFile=new File(newPath); Map<String, String> map = new HashMap<String, String>(); map.put("$QYMC$", "xxx科技股份有限公司"); map.put("$QYDZ$", "上海市楊浦區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(); } /** * 調用手機中安裝的可打開word的軟件 */ private void doOpenWord(){ Intent intent = new Intent(); intent.setAction("android.intent.action.VIEW"); intent.addCategory("android.intent.category.DEFAULT"); String fileMimeType = "application/msword"; intent.setDataAndType(Uri.fromFile(new File(newPath)), fileMimeType); try{ MainActivity.this.startActivity(intent); } catch(ActivityNotFoundException e) { //檢測到系統尚未安裝OliveOffice的apk程序 Toast.makeText(MainActivity.this, "未找到軟件", Toast.LENGTH_LONG).show(); //請先到www.olivephone.com/e.apk下載并安裝 } } /** * demoFile 模板文件 * newFile 生成文件 * map 要填充的數據 * */ 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文本內容 Range range = hdt.getRange(); // System.out.println(range.text());  // 替換文本內容 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); // 輸出字節流 out.write(ostream.toByteArray()); out.close(); ostream.close(); } catch(IOException e) { e.printStackTrace(); } catch(Exception e) { e.printStackTrace(); } } }

上面代碼的代碼并不多,首先我們要注意的是我們使用的poi的api大部分是在org.apache.poi.hwpf下面的,大家不要導錯包了,因為apache每個包對應的內容不同:

Android,模板,手機,Word

上面代碼不難懂,就是把我們要放的內容使用特定的代號組裝一個map塞到我們的模板里面去,然后重新存儲下,不過我們模板也要使用相同的代號、poi才能識別:

Android,模板,手機,Word

這樣我們就使用模板大功告成了,就可以查看了、但是有些手機并沒有裝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文檔轉成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()); //設置圖片路徑 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();  } } } wordToHtmlConverter.processDocument(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"); serializer.setOutputProperty(OutputKeys.METHOD, "html"); serializer.transform(domSource, streamResult); out.close(); //保存html文件 writeFile(new String(out.toByteArray()), outPutFile); } catch (Exception e) { e.printStackTrace(); } } /** * 將html文件保存到sd卡 * */ public void writeFile(String content, String path) { FileOutputStream fos = null; BufferedWriter bw = null; try { File file = new File(path); if(!file.exists()){ file.createNewFile(); } fos = new FileOutputStream(file); bw = new BufferedWriter(new OutputStreamWriter(fos,"utf-8")); bw.write(content); } 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) { } } }}

上面的代碼的原理起始也很簡單,poi提供了讓word文檔轉換成html頁面的方法、我們只需要使用webview來加載這個html就ok了,這樣我們就可以再手機端直接查看我們的word文檔了,是不是好強大。其實看起來的比較復雜的功能只要我們靜下心來想想就沒有我們想象中的那么復雜,今天就為大家分享到這了。

分享Demo的源碼:Android使用模板生成Word文檔

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品三级美女白浆呻吟| 亚洲一区二区免费在线| 欧美激情久久久久久| 欧美激情xxxx| 激情亚洲一区二区三区四区| 午夜精品一区二区三区在线| 亚洲xxxx妇黄裸体| 岛国视频午夜一区免费在线观看| 欧美性xxxxxxx| 少妇精69xxtheporn| 欧美在线观看日本一区| 国产精品欧美一区二区三区奶水| 亚洲欧洲成视频免费观看| 日韩欧美在线免费观看| 亚洲白虎美女被爆操| 国产免费一区二区三区在线能观看| 午夜精品福利在线观看| 亚洲韩国欧洲国产日产av| 国产成人一区二区三区电影| 在线日韩第一页| 国内精久久久久久久久久人| 一本一本久久a久久精品牛牛影视| 成人字幕网zmw| 2019中文字幕在线免费观看| 久久91亚洲精品中文字幕奶水| 91av免费观看91av精品在线| 日韩中文字幕在线| 国产精品av网站| 久久伊人免费视频| 一区二区福利视频| 亚洲高清福利视频| 福利二区91精品bt7086| 国产视频精品va久久久久久| 欧美成人黑人xx视频免费观看| 92福利视频午夜1000合集在线观看| 中文字幕日韩av综合精品| 欧美成年人视频网站欧美| 久久精品亚洲94久久精品| 欧美成人精品一区二区| 久久久在线免费观看| 欧美日韩国产在线看| 欧美成人免费观看| 亚洲国产古装精品网站| 92看片淫黄大片看国产片| 亚洲国产精品视频在线观看| 亚洲欧美日韩直播| 亚洲在线一区二区| 黄色成人在线播放| 国产精品女主播| 亚洲精品国产精品国产自| 91久久久久久国产精品| 日韩高清中文字幕| 久久99精品视频一区97| 欧美午夜电影在线| 欧美性xxxxx极品娇小| 福利微拍一区二区| 国产精品白丝jk喷水视频一区| 日韩欧美国产一区二区| 日韩国产精品视频| 日韩中文字幕欧美| 韩国视频理论视频久久| 欧美一级视频免费在线观看| 精品一区精品二区| 亚洲成**性毛茸茸| 欧美电影在线免费观看网站| 欧美性少妇18aaaa视频| 欧美黑人狂野猛交老妇| 亚洲欧美中文在线视频| 亚洲肉体裸体xxxx137| 欧美日韩精品在线观看| www.99久久热国产日韩欧美.com| 欧美精品一二区| 日本19禁啪啪免费观看www| 91免费福利视频| 国产精品91一区| 午夜精品久久久久久久久久久久久| 国产在线精品一区免费香蕉| 高清视频欧美一级| 97国产精品人人爽人人做| 岛国视频午夜一区免费在线观看| 欧美老女人www| 久久99国产精品久久久久久久久| 久久久亚洲福利精品午夜| 精品一区二区三区电影| 国内精品久久久| 久久亚洲欧美日韩精品专区| 亚洲成人精品久久| 精品免费在线观看| 国产精品xxxxx| 91精品国产九九九久久久亚洲| 亚洲午夜未满十八勿入免费观看全集| 日韩精品福利在线| 国产欧美日韩专区发布| 亚洲美女在线视频| 日韩精品999| 国产成人av在线播放| 亚洲天堂第二页| 国产国语刺激对白av不卡| 久久中文字幕在线视频| 最近2019中文免费高清视频观看www99| 亚洲成人黄色在线观看| 日韩美女中文字幕| 国产美女久久精品香蕉69| 欧美激情欧美激情在线五月| 精品视频久久久久久久| 亚洲午夜未满十八勿入免费观看全集| 深夜福利亚洲导航| 亚洲一区免费网站| 美女av一区二区三区| 欧美极品第一页| 亚洲专区国产精品| 日韩免费观看在线观看| 日韩欧美中文字幕在线观看| 成人综合国产精品| 久久中国妇女中文字幕| 日韩av在线不卡| 亚洲第一精品夜夜躁人人躁| 在线日韩欧美视频| 亚洲欧美国产精品久久久久久久| 亚洲国产91精品在线观看| 成人做爰www免费看视频网站| 亚洲激情在线观看视频免费| 亚洲视频欧美视频| 色综合视频一区中文字幕| 青青草原成人在线视频| 欧美成人免费小视频| 欧美一区三区三区高中清蜜桃| 精品中文视频在线| 亚洲国产精品悠悠久久琪琪| 久久国产精品首页| 人体精品一二三区| 亚洲日本欧美中文幕| 国产精品欧美激情| 久久这里有精品| 精品中文字幕久久久久久| 国产精品一二三视频| 国产精品成人v| 国产成人在线视频| 97人人模人人爽人人喊中文字| www.欧美精品一二三区| 4438全国成人免费| 国产精品都在这里| 欧美视频在线观看免费| 日韩精品免费一线在线观看| 九九热这里只有精品免费看| 国产日韩av在线播放| 欧美精品一区在线播放| 国产成人精品视频在线| 国产精品视频久久久久| 日韩中文字幕国产| 国产精品视频xxxx| 91久久国产婷婷一区二区| 亚洲在线观看视频网站| 国产精品无av码在线观看| 成人中文字幕+乱码+中文字幕| 日韩在线播放一区| 91手机视频在线观看| 日韩精品亚洲精品| 久久精品国产成人精品| 欧美性视频在线| 欧美大片大片在线播放| 国产欧美最新羞羞视频在线观看| 亚洲色图欧美制服丝袜另类第一页| 久久久女女女女999久久|