【Android开发】Android打开并读取Word文件到html中采用PIO技术

看到网上很多关于Android打开word文件的例子,最多的也只有poi,也记不清楚是在哪转载的了,反正是运行不了,经过长时间研究并对原帖作了一定修改后,能正常运行了,并能正确显示word里的文字图片表格。

 

首先 需要下载两个 poi-3.7-20101029.jar 和poi-scratchpad-3.7-20101029.jar 可以下载3.9的了

下载地址:http://poi.apache.org/download.html

1、ViewFile.java 文件

 

public class ViewFile extends Activity {

	private String nameStr = null;
	private Range range = null;
	private HWPFDocument hwpf = null;
	private String htmlPath;
	private String picturePath;
	private WebView view;
	private List pictures;
	private TableIterator tableIterator;
	private int presentPicture = 0;
	private int screenWidth;
	private FileOutputStream output;
	private File myFile;

	@SuppressLint("SdCardPath")
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.view);
		view = (WebView) findViewById(R.id.show);
		screenWidth = this.getWindowManager().getDefaultDisplay().getWidth() - 10;
		Intent intent = this.getIntent();
		Bundle bundle = intent.getExtras();
		nameStr = bundle.getString("name");
		getRange();
		makeFile();
		readAndWrite();

	view.loadUrl("file://" + htmlPath);
	      
//view.loadDataWithBaseURL("file://" + htmlPath, "", "text/html", "utf-8", "");
//	view.loadUrl("file://"+"/mnt/sdcard/"+"xiao/my.html");
	//	view.loadUrl("content://com.android.htmlfileprovider" + htmlPath);
		System.out.println("htmlPath" + htmlPath);
	}

	public boolean onCreateOptionsMenu(Menu menu) {

		super.onCreateOptionsMenu(menu);
		menu.add(0, 0, 0, "关于文件").setIcon(
				this.getResources().getDrawable(R.drawable.importdb));
		menu.add(0, 1, 1, "关于作者").setIcon(
				this.getResources().getDrawable(R.drawable.exportdb));
		return true;
	}

	public boolean onOptionsItemSelected(MenuItem item) {

		switch (item.getItemId()) {
		case 0:
			showDialog(0);
			break;
		case 1:
			showDialog(1);
			break;
		}
		return super.onOptionsItemSelected(item);
	}

	protected Dialog onCreateDialog(int id) {
		switch (id) {
		case 0:
			return buildDialogProgram(ViewFile.this);
		case 1:
			return buildDialogAuthor(ViewFile.this);
		}
		return null;
	}

	private Dialog buildDialogAuthor(Context context) {

		AlertDialog.Builder builder = new AlertDialog.Builder(context);
		builder.setIcon(this.getResources().getDrawable(R.drawable.dslab));
		builder.setTitle(this.getResources().getString(R.string.aboutauthor));
		builder.setMessage(this.getResources().getString(R.string.author));
		builder.setPositiveButton(
				this.getResources().getString(R.string.gotit),
				new DialogInterface.OnClickListener() {

					public void onClick(DialogInterface dialog, int which) {
						// TODO Auto-generated method stub
						dialog.dismiss();
					}

				});
		return builder.create();

	}

	private Dialog buildDialogProgram(Context context) {

		AlertDialog.Builder builder = new AlertDialog.Builder(context);
		builder.setTitle(this.getResources().getString(R.string.aboutprogram));
		builder.setIcon(this.getResources().getDrawable(R.drawable.importdb));
		String programInfo = this.getResources().getString(R.string.word)
				+ hwpf.characterLength() + "\n";
		programInfo = programInfo
				+ this.getResources().getString(R.string.paragrap)
				+ range.numParagraphs() + "\n";
		programInfo = programInfo
				+ this.getResources().getString(R.string.pictures)
				+ pictures.size() + "\n";

		builder.setMessage(programInfo);
		builder.setPositiveButton(
				this.getResources().getString(R.string.gotit),
				new DialogInterface.OnClickListener() {

					public void onClick(DialogInterface dialog, int which) {
						// TODO Auto-generated method stub
						dialog.dismiss();
					}
				});

		return builder.create();
	}

	public void makeFile() {

		String sdStateString = android.os.Environment.getExternalStorageState();

		if (sdStateString.equals(android.os.Environment.MEDIA_MOUNTED)) {
			try {
				File sdFile = Environment.getExternalStorageDirectory();

				String path = sdFile + File.separator
						+ "xiao";

				String temp = path + File.separator + "my.html";

				String filePath=Environment.getExternalStorageDirectory()+"/xiao/my.html";
				File dirFile = new File(path);
				if (!dirFile.exists()) {
					dirFile.mkdir();
				}
				File myFile = new File(path + File.separator + "my.html");

				if (!myFile.exists()) {
					myFile.createNewFile();
				}

	
				htmlPath = myFile.getAbsolutePath();
			} catch (Exception e) {

			}
		}
	}

	/* 用来在sdcard上创建图片 */
	public void makePictureFile() {
		String sdString = android.os.Environment.getExternalStorageState();
		if (sdString.equals(android.os.Environment.MEDIA_MOUNTED)) {
			try {
				File picFile = android.os.Environment
						.getExternalStorageDirectory();
				String picPath = picFile.getAbsolutePath() + File.separator
						+ "xiao";
				File picDirFile = new File(picPath);
				if (!picDirFile.exists()) {
					picDirFile.mkdir();
				}
				File pictureFile = new File(picPath + File.separator
						+ presentPicture + ".jpg");
				if (!pictureFile.exists()) {
					pictureFile.createNewFile();
				}
				picturePath = pictureFile.getAbsolutePath();
			} catch (Exception e) {
				System.out.println("PictureFile Catch Exception");
			}
		}
	}

	public void onDestroy() {
		super.onDestroy();
	}

	/* 读取word中的内容写到sdcard上的.html文件中 */
	public void readAndWrite() {

		try {
			myFile = new File(htmlPath);
			output = new FileOutputStream(myFile);
			String head = "<html><meta http-equiv='Content-Type' content='text/html; charset=utf-8'><body>";
			String tagBegin = "<p>";
			String tagEnd = "</p>";

			output.write(head.getBytes());

			int numParagraphs = range.numParagraphs();

			for (int i = 0; i < numParagraphs; i++) {
				Paragraph p = range.getParagraph(i);

				if (p.isInTable()) {
					int temp = i;
					if (tableIterator.hasNext()) {
						String tableBegin = "<table style=\"border-collapse:collapse\" border=1 bordercolor=\"black\">";
						String tableEnd = "</table>";
						String rowBegin = "<tr>";
						String rowEnd = "</tr>";
						String colBegin = "<td>";
						String colEnd = "</td>";

						Table table = tableIterator.next();

						output.write(tableBegin.getBytes());

						int rows = table.numRows();

						for (int r = 0; r < rows; r++) {
							output.write(rowBegin.getBytes());
							TableRow row = table.getRow(r);
							int cols = row.numCells();
							int rowNumParagraphs = row.numParagraphs();
							int colsNumParagraphs = 0;
							for (int c = 0; c < cols; c++) {
								output.write(colBegin.getBytes());
								TableCell cell = row.getCell(c);
								int max = temp + cell.numParagraphs();
								colsNumParagraphs = colsNumParagraphs
										+ cell.numParagraphs();
								for (int cp = temp; cp < max; cp++) {
									Paragraph p1 = range.getParagraph(cp);
									output.write(tagBegin.getBytes());
									writeParagraphContent(p1);
									output.write(tagEnd.getBytes());
									temp++;
								}
								output.write(colEnd.getBytes());
							}
							int max1 = temp + rowNumParagraphs;
							for (int m = temp + colsNumParagraphs; m < max1; m++) {
								Paragraph p2 = range.getParagraph(m);
								temp++;
							}
							output.write(rowEnd.getBytes());
						}
						output.write(tableEnd.getBytes());
					}
					i = temp;
				} else {
					output.write(tagBegin.getBytes());
					writeParagraphContent(p);
					output.write(tagEnd.getBytes());
				}
			}

			String end = "</body></html>";
			output.write(end.getBytes());
			output.close();
		} catch (Exception e) {
			System.out.println("readAndWrite Exception");
		}
	}

	/* 以段落的形式来往html文件中写内容 */
	public void writeParagraphContent(Paragraph paragraph) {
		Paragraph p = paragraph;
		int pnumCharacterRuns = p.numCharacterRuns();

		for (int j = 0; j < pnumCharacterRuns; j++) {

			CharacterRun run = p.getCharacterRun(j);

			if (run.getPicOffset() == 0 || run.getPicOffset() >= 1000) {
				if (presentPicture < pictures.size()) {
					writePicture();
				}
			} else {
				try {
					String text = run.text();
					if (text.length() >= 2 && pnumCharacterRuns < 2) {
						output.write(text.getBytes());
					} else {
						int size = run.getFontSize();
						int color = run.getColor();
						String fontSizeBegin = "<font size=\""
								+ decideSize(size) + "\">";
						String fontColorBegin = "<font color=\""
								+ decideColor(color) + "\">";
						String fontEnd = "</font>";
						String boldBegin = "<b>";
						String boldEnd = "</b>";
						String islaBegin = "<i>";
						String islaEnd = "</i>";

						output.write(fontSizeBegin.getBytes());
						output.write(fontColorBegin.getBytes());

						if (run.isBold()) {
							output.write(boldBegin.getBytes());
						}
						if (run.isItalic()) {
							output.write(islaBegin.getBytes());
						}

						output.write(text.getBytes());

						if (run.isBold()) {
							output.write(boldEnd.getBytes());
						}
						if (run.isItalic()) {
							output.write(islaEnd.getBytes());
						}
						output.write(fontEnd.getBytes());
						output.write(fontEnd.getBytes());
					}
				} catch (Exception e) {
					System.out.println("Write File Exception");
				}
			}
		}
	}

	/* 将word中的图片写入到.jpg文件中 */
	public void writePicture() {
		Picture picture = (Picture) pictures.get(presentPicture);

		byte[] pictureBytes = picture.getContent();

		Bitmap bitmap = BitmapFactory.decodeByteArray(pictureBytes, 0,
				pictureBytes.length);

		makePictureFile();
		presentPicture++;

		File myPicture = new File(picturePath);

		try {

			FileOutputStream outputPicture = new FileOutputStream(myPicture);

			outputPicture.write(pictureBytes);

			outputPicture.close();
		} catch (Exception e) {
			System.out.println("outputPicture Exception");
		}

		String imageString = "<img src=\"" + picturePath + "\"";

		if (bitmap.getWidth() > screenWidth) {
			imageString = imageString + " " + "width=\"" + screenWidth + "\"";
		}
		imageString = imageString + ">";

		try {
			output.write(imageString.getBytes());
		} catch (Exception e) {
			System.out.println("output Exception");
		}
	}

	/* 处理word和html字体的转换 */
	public int decideSize(int size) {

		if (size >= 1 && size <= 8) {
			return 1;
		}
		if (size >= 9 && size <= 11) {
			return 2;
		}
		if (size >= 12 && size <= 14) {
			return 3;
		}
		if (size >= 15 && size <= 19) {
			return 4;
		}
		if (size >= 20 && size <= 29) {
			return 5;
		}
		if (size >= 30 && size <= 39) {
			return 6;
		}
		if (size >= 40) {
			return 7;
		}
		return 3;
	}

	/* 处理word和html颜色的转换 */
	private String decideColor(int a) {
		int color = a;
		switch (color) {
		case 1:
			return "#000000";
		case 2:
			return "#0000FF";
		case 3:
		case 4:
			return "#00FF00";
		case 5:
		case 6:
			return "#FF0000";
		case 7:
			return "#FFFF00";
		case 8:
			return "#FFFFFF";
		case 9:
			return "#CCCCCC";
		case 10:
		case 11:
			return "#00FF00";
		case 12:
			return "#080808";
		case 13:
		case 14:
			return "#FFFF00";
		case 15:
			return "#CCCCCC";
		case 16:
			return "#080808";
		default:
			return "#000000";
		}
	}

	private void getRange() {
		FileInputStream in = null;
		POIFSFileSystem pfs = null;
		try {
			in = new FileInputStream(nameStr);
			pfs = new POIFSFileSystem(in);
			hwpf = new HWPFDocument(pfs);
		} catch (Exception e) {

		}
		range = hwpf.getRange();

		pictures = hwpf.getPicturesTable().getAllPictures();

		tableIterator = new TableIterator(range);

	}

	/* 处理点击返回按钮 */
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK) {
			Intent intent = new Intent();
			intent.setClass(ViewFile.this, browse.class);
			startActivity(intent);
			this.finish();
		}
		return false;
	}
}

 

2、 browse.java 文件

 

public class browse extends Activity {
	private  ListView listV = null;
	private List<File> list = null;
	private int a[] = {R.drawable.doc,R.drawable.dir};
	private ArrayList<HashMap<String, Object>> recordItem;
	
	private File presentFile;
	
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.browse);
		listV = (ListView)findViewById(R.id.list);
		list_files();
	}
	private void list_files(){
		File path = android.os.Environment.getExternalStorageDirectory();
		presentFile = path;
		File[] file = path.listFiles();
		fill(file);
	}
	private void fill(File[] file){
		SimpleAdapter adapter = null;
		recordItem = new ArrayList<HashMap<String, Object>>();
		list = new ArrayList<File>();
		for(File f: file){
			if(Invalid(f) == 1){
				list.add(f);
				HashMap<String, Object> map = new HashMap<String, Object>();
				map.put("picture", a[0]);
				map.put("name", f.getName());
				recordItem.add(map);
			}
			if(Invalid(f) == 0){
				list.add(f);
				HashMap<String, Object> map = new HashMap<String, Object>();
				map.put("picture", a[1]);
				map.put("name", f.getName());
				recordItem.add(map);
			}
		}
		
		
		adapter = new SimpleAdapter(this, recordItem, R.layout.item, new String[]{"picture", "name"}, new int[]{R.id.picture, R.id.text});
		listV.setAdapter(adapter);
		listV.setAdapter(adapter);
		listV.setOnItemClickListener(new Clicker());
	}

	private int Invalid(File f){
		if(f.isDirectory()){
			return 0;
		}
		else{
			String filename = f.getName().toLowerCase();
			if(filename.endsWith(".doc")){
				return 1;
			}
			return 2;
		}
	}
	private class Clicker implements OnItemClickListener{
		
		public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
				long arg3) {
			// TODO Auto-generated method stub
			Intent i = new Intent();
			String nameStr = null;
			i.setClass(browse.this, ViewFile.class);
			Bundle bundle = new Bundle();
			File file = list.get(arg2);
			presentFile = file;
			if(file.isDirectory()){
				File[] files = file.listFiles();
				fill(files);
				
			}
			else{
				nameStr = file.getAbsolutePath();
				bundle.putString("name", nameStr);
				i.putExtras(bundle);
				startActivity(i);
				finish();
			}
		}
	}
	
	public boolean onKeyDown(int keyCode, KeyEvent event) {
	   	if (keyCode == KeyEvent.KEYCODE_BACK) {
	   		if(presentFile.isDirectory()){
	   			if(presentFile.equals(android.os.Environment.getExternalStorageDirectory())){
	   				this.finish();
	   			}
	   			else{
	   				presentFile = presentFile.getParentFile();
	   				File file = presentFile;
	   				File[] files = file.listFiles();
	   				fill(files);
	   			}
	   		}
	   		if(presentFile.isFile()){
	   			if(presentFile.getParentFile().isDirectory()){
	   				presentFile = presentFile.getParentFile();
	   				File file = presentFile;
	   				File[] files = file.listFiles();
	   				fill(files);
	   			}
	   		}
	   	}
		return false;	
	 }

}

 

最后要添加权限哦

 

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>


运行结果:

源码下载地址:http://download.csdn.net/detail/u011213088/5929693

目前还存在一些问题,比如,打开带有数学公式的文档有时候显示不了,求解决办法!
 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值