在Android中显示视图中的MS Word文件(如TextView)

我想在Android的View中显示一个.docx文件。 该文件具有math符号,也在文本之间的图像。 我想要显示很多这样的文件,并通过swipe手势翻阅它们。 我已经成功完成.txt文件的相同。 现在可以很轻松地进入下一页的刷卡。 .txt文件的代码如下所示:

 public String readTxt(String fileName) { try { InputStream is; is = context.getAssets().open(fileName + ".txt"); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); int i; i = is.read(); while (i != -1) { byteArrayOutputStream.write(i); i = is.read(); } is.close(); return byteArrayOutputStream.toString(); } catch (IOException e) { e.printStackTrace(); } return fileName; } 

这段代码返回我在TextView显示的文本。 这样,我只需要dynamic更改文件的名称,然后滑动文本更改。

现在我想修改这段代码,以便显示包含文本,图像和math符号的MS Word文件(.docx)。

我已经在堆栈溢出以及其他论坛上检查了许多类似的话题:这些是许多人提出的类似问题的答案,我已经给了这些尝试: Link1和Link2

在许多其他线程上,人们推荐Jopendocument 。 我也读了一下,了解到Android不支持打开的文档格式。 所以这个选项似乎不太可能 但是,如果您有任何解决方法或关于将JOpenDocument库添加到项目并显示丰富文本的详细解释,请分享该解决scheme,因为我已经search了很多,但找不到任何。

另外还有一个名为OliveDocLibrary的库,可以在android上显示丰富的word文件。 这里是我从哪里下载lib的链接 。 包含在该下载包中的演示程序工作得很好。但是该lib是一个试用版。 所以我正在试图和这个库一起工作,看看它到底在哪里。 但我仍然在寻找更好的select。

任何有关这个帮助表示赞赏。 除了上面提到的指针之外,任何指针都是非常受欢迎的。

更新:

我得到了一个build议,告诉我在开始这个问题的第一个赏金时使用Apache POI (更具体地说是HWPF)。 在探索Apache POI一段时间后,我得到了很less的代码,这些代码是写入doc文件,阅读doc文件,更新excel表格等。

我从互联网上find的这样的示例代码(对于Java)就是这样的:

 import java.io.*; import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.hwpf.extractor.WordExtractor; public class ReadDocFile { public static void main(String[] args) { File file = null; WordExtractor extractor = null ; try { file = new File("c:\\New.doc"); FileInputStream fis=new FileInputStream(file.getAbsolutePath()); HWPFDocument document=new HWPFDocument(fis); extractor = new WordExtractor(document); String [] fileData = extractor.getParagraphText(); for(int i=0;i<fileData.length;i++){ if(fileData[i] != null) System.out.println(fileData[i]); } } catch(Exception exep){} } } 

所以我把这个库(Apache POI)添加到了我在Eclipse中的Android项目中,并尝试了一些更改的示例代码。 并试图在TextView上显示它。 这里的问题虽然是它不显示像OliveDocLibrary那样的图像。 因此,如果有人要build议Apache POI,那么我需要一个可读取docx文件及其所有内容(包括图像)的可靠指针或代码,并将其显示在自定义视图中。

Apache POI是一件好事,但遗憾的是我没有find任何实例/示例来实现这些库。 如果你知道一个很好的例子(只有MS字),那么请分享他们的意见。

更新2

OliveDocLibrary包提供的代码工作正常。 尽pipe在视图上有橄榄色的水印。 目前正在对该代码执行Swipe 。 但问题仍然是它的试用版。

更新3:

我认为OliveDocLibrary是最有效的方法。 虽然它有一个试用版的缺点,但我认为没有其他图书馆比这个图书馆做得更好,完全满足了我的具体要求。 详细的答案已张贴在下面 。 由于赏金时间即将结束。 我会请那些可能有更好的解决scheme的人尽快发布。 现在我正在与OliveDocLibrary并接受我自己的答案。

Solutions Collecting From Web of "在Android中显示视图中的MS Word文件(如TextView)"

你好人经过多多考虑和看地狱很多的select和变通办法,我认为OliveDocLibrary是最好的方式来做到这一点。 这里是链接 ,这将给你直接到Android的三个库的下载页面,用于DOC,XLS和PPT。 所有这些工作都非常好。 你将下载的包文件夹将有三个文件夹里面。 哪个是:

  1. API
  2. lib_trial
  3. 演示

演示文件夹中,您将findWord的示例项目。 您可以直接将此项目导入Eclipse中的工作区,并自行testing代码。 为了方便人们在这里发布代码。 我删除了一些我觉得没有必要的代码(关于我的问题的答案)。 所以代码有两个文件,主要活动是FileChooser ,如下所示:

 public class FileChooser extends Activity { private String filePath = Environment.getExternalStorageDirectory() .getPath() + "/simple.docx"; MyBaseAdapter adapter; private static String parentPath; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(2); copyFileToSdcard(); Intent intent = new Intent(FileChooser.this, OliveWordTrailDemoAcitivy.class); intent.setAction(Intent.ACTION_VIEW); intent.setData(Uri.fromFile(new File(filePath))); startActivity(intent); } class MyBaseAdapter extends BaseAdapter { private String[] list; public MyBaseAdapter(String[] list) { this.list = list; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = new TextView(FileChooser.this); ((TextView) convertView).setTextSize(35); } ((TextView) convertView).setText(list[position]); return convertView; } @Override public long getItemId(int position) { return position; } @Override public Object getItem(int position) { return null; } @Override public int getCount() { return list.length; } public void setList(String[] list) { this.list = list; } }; class MyItemClickListener implements OnItemClickListener { String[] list; InputStream is; public MyItemClickListener(String[] list) { this.list = list; } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { File file = new File(parentPath + list[position]); if (file.isFile()) { Intent intent = new Intent(FileChooser.this, OliveWordTrailDemoAcitivy.class); intent.setAction(Intent.ACTION_VIEW); intent.setData(Uri.fromFile(file)); startActivity(intent); } else { list = file.list(); adapter.setList(list); adapter.notifyDataSetChanged(); parentPath = file.getAbsolutePath() + "/"; } } } private void copyFileToSdcard() { InputStream inputstream = getResources().openRawResource( R.raw.simple); byte[] buffer = new byte[1024]; int count = 0; FileOutputStream fos = null; try { fos = new FileOutputStream(new File(filePath)); while ((count = inputstream.read(buffer)) > 0) { fos.write(buffer, 0, count); } fos.close(); } catch (FileNotFoundException e1) { e1.printStackTrace(); Toast.makeText(FileChooser.this, "Check your sdcard", Toast.LENGTH_LONG).show(); } catch (IOException e) { e.printStackTrace(); } } } 

在这里,我已经放置了一个名为simple.docx的doc文件,其中包含可正确显示和显示的图像和math符号。 这个活动与OliveWordTrialDemoActivity交互,如下所示:

 public class OliveWordTrailDemoAcitivy extends Activity implements OnClickListener, CommentListener, NoteListener, HyperlinkListener, ProgressListener { OliveWordOperator viu; EditText searchEditText; ArrayList<String> bookmarks; Handler handler; protected void onCreate(Bundle savedInstanceState) { viu = new OliveWordOperator(this, this); super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_PROGRESS); setProgressBarVisibility(true); getWindow().setFeatureInt(Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON); setContentView(R.layout.demo_view); OliveWordView view = (OliveWordView) findViewById(R.id.test_view); try { viu.init(view, getIntent().getData()); viu.start(viu.isEncrypted(), "111"); } catch (Exception e) { e.printStackTrace(); } handler = new Handler(){ @Override public void handleMessage(Message msg) { setProgress(msg.what * 10); super.handleMessage(msg); } }; } @Override protected void onDestroy() { viu.release(); super.onDestroy(); } @Override public void getComment(ArrayList<String[]> comments) { for (int i = 0; i < comments.size(); i++) { AlertDialog.Builder builder = new Builder(this); builder.setTitle(comments.get(i)[0]).setMessage(comments.get(i)[1]) .show(); } } @Override public void getHyperlink(String hyperlink) { if (Uri.parse(hyperlink).getScheme().contains("mailto")) { try { startActivity(new Intent(Intent.ACTION_SENDTO, Uri.parse(hyperlink))); } catch (ActivityNotFoundException anfe) { Toast.makeText(this, "can't found email application", Toast.LENGTH_SHORT).show(); } } else { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(hyperlink))); } } @Override public void getNote(SparseArray<String> notes) { for (int i = 0; i < notes.size(); i++) { AlertDialog.Builder builder = new Builder(this); if (notes.keyAt(i) == NoteListener.FOOTNOTE) { builder.setTitle("footnote").setMessage(notes.valueAt(i)) .show(); } else if (notes.keyAt(i) == NoteListener.ENDNOTE) { builder.setTitle("endnote").setMessage(notes.valueAt(i)).show(); } } } public void goToBookmarks(String name) { viu.goToBookmark(name); } public void listBookmarks() { this.bookmarks = viu.listBookmarks(); } @Override public void notifyProgress(int progress) { handler.sendEmptyMessage(progress); } @Override public void onClick(View v) { } } 

lib_trial文件夹中,如果要单独使用,可以find可以添加到libs文件夹的库。

API文件夹中,您将find一个PDF文件格式的库和它的方法的详细描述,这是很容易理解的。 所以人们可以直接使用这个库,并使用提供给他们的具体要求的方法。

所以这就是现在的解决scheme。 欢迎任何更好的解决scheme。 赏金时间即将结束,请尽快提供其他解决scheme。 谢谢。

正如你在你的问题中提到,你已经尝试了像Jopendocument, OliveDocLibraryApache POI这样的库Jopendocument,但没有运气。

现在我想要修改这段代码,这样我就可以显示包含文本,图像和math符号的MS Word文件(.docx)。

在研究过程中,我又遇到了另外一个名叫Tika的图书馆,它也用来提取数据及其支持列表文件 ,甚至是天秤座办公室 ,你可以在那里读写和pipe理文件。

最后的build议:

您可以通过将doc to htmlhtml to pdf转换html to pdf 来实现 。

doc to html转换doc to html请参考堆栈溢出的答案