最近程序人生(http://www.manong123.com)一个朋友让我帮他做一个小功能,其实就是把WORD文档里的内容存到数据库里去,可以实现搜索并转EXCEL的功能,需求很简单,想不到加上部署折腾了我一个星期,我先把需求详细描述一下:

提供一个WORD文档的样板,这个WORD文档里大部分是文本,其中插入了一个EXCEL表格,WORD的内容如下:

房地产价值监证确认书

编号:(2009交)价确字第   号

邓征兵  :

根据您的委托,我单位派遣专业评估人员对位于  大祥区翠园    的房地产(《房屋所有权证》)号为 0013210 ,房屋所有权人  邓文兵   房屋所在层次/总层数  6 / 8 ,进行了现场勘估。

评定估价对象房屋的结构等级为    砖混     ,建成年代为 90年代末  ,成新度为   9成   。

确认房屋价值如下表:

这里有个EXCEL表格

监证目的:交易课税

备注:

邵阳市房产产权监理处价格管理科

现场评估:黄生忠

审    批:

 2009 年 2 月 10 日

就是把这个文件中相关内容存入数据库,同时要能够实现查询,比如根据委托人查询,同时要把查询的结果能转EXCEL。

功能就是这样的,先把其中用到的技术点挑出来,

一读WORD里的内容,这个并不难;

Microsoft.Office.Interop.Word.ApplicationClass wordApp = new Microsoft.Office.Interop.Word.ApplicationClass();
object file = nam;
object nullobj = System.Reflection.Missing.Value;
try
{
Microsoft.Office.Interop.Word.Document doc = wordApp.Documents.Open(
ref file, ref nullobj, ref nullobj,
ref nullobj, ref nullobj, ref nullobj,
ref nullobj, ref nullobj, ref nullobj,
ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj); //doc.ActiveWindow.Selection.WholeStory(); //doc.ActiveWindow.Selection.Copy(); //IDataObject data = Clipboard.GetDataObject(); fileContent = doc.Content.Text; //这里读取所有的WORD里的文本
}

二读WORD文件里EXCEL里的数据,这个是比较困难的,我试了很多方式,也没有查到相关的资料,最后在国外论坛上看见了VB的代码,然后修改了一下,可以用;

foreach (Microsoft.Office.Interop.Word.InlineShape ish in doc.InlineShapes)
{
if (ish.Type == Microsoft.Office.Interop.Word.WdInlineShapeType.wdInlineShapeEmbeddedOLEObject)
{
if (ish.OLEFormat.ProgID == "Excel.Sheet.8")
{
//ish.OLEFormat.DoVerb(ref nullobj); ish.OLEFormat.Activate();
Microsoft.Office.Interop.Excel.Workbook objEXl = (Microsoft.Office.Interop.Excel.Workbook)ish.OLEFormat.Object;
buildArea = ((objEXl.Worksheets[] as Microsoft.Office.Interop.Excel.Worksheet).Cells[, ] as Microsoft.Office.Interop.Excel.Range).Text.ToString();
if (buildArea != "")
{
buildUnitPrice = ((objEXl.Worksheets[] as Microsoft.Office.Interop.Excel.Worksheet).Cells[, ] as Microsoft.Office.Interop.Excel.Range).Text.ToString();
buildCountPrice = ((objEXl.Worksheets[] as Microsoft.Office.Interop.Excel.Worksheet).Cells[, ] as Microsoft.Office.Interop.Excel.Range).Text.ToString();
userKind = "住宅";
}
else
{
buildArea = ((objEXl.Worksheets[] as Microsoft.Office.Interop.Excel.Worksheet).Cells[, ] as Microsoft.Office.Interop.Excel.Range).Text.ToString();
buildUnitPrice = ((objEXl.Worksheets[] as Microsoft.Office.Interop.Excel.Worksheet).Cells[, ] as Microsoft.Office.Interop.Excel.Range).Text.ToString();
buildCountPrice = ((objEXl.Worksheets[] as Microsoft.Office.Interop.Excel.Worksheet).Cells[, ] as Microsoft.Office.Interop.Excel.Range).Text.ToString();
userKind = "非住宅";
}
objEXl.Application.Quit();
}
}
}

三正则表达式的应用,我要获取比如邓征兵这个委托人,我不可能用SUBSTRING来取数据吧,这样效果太低了;

Regex reg1 = new Regex("[\u4E00-\u9FFF]+", RegexOptions.IgnoreCase);
userName = reg1.Match(doc.Paragraphs[].Range.Text).Value.Trim();//委托人
Regex reg2 = new Regex("评估人员对位于([\\S|\\s]+)的房地产", RegexOptions.IgnoreCase);
HouseAddr = reg2.Match(fileContent).Groups[].Value.Trim();//房子地址doc.Paragraphs[5].Range.Text
Regex reg3 = new Regex("号为([\\S|\\s]+),房屋所有权人", RegexOptions.IgnoreCase);
propertyNo = reg3.Match(fileContent).Groups[].Value.Trim();//房产证号doc.Paragraphs[5].Range.Text
Regex reg4 = new Regex("房屋所有权人([\\S|\\s]+)房屋所在层次", RegexOptions.IgnoreCase);
propertyUser = reg4.Match(fileContent).Groups[].Value.Trim();//房屋所有权人doc.Paragraphs[5].Range.Text
Regex reg5 = new Regex("层次/总层数([\\S|\\s]+),进行了现场勘估", RegexOptions.IgnoreCase);
buildCount = reg5.Match(fileContent).Groups[].Value.Trim();//层次/总层数doc.Paragraphs[5].Range.Text
Regex reg6 = new Regex("建成年代为([\\S|\\s]+),成新度为", RegexOptions.IgnoreCase);
buildYear = reg6.Match(fileContent).Groups[].Value.Trim();//建成年代doc.Paragraphs[6].Range.Text
Regex reg7 = new Regex("现场评估:([\\S|\\s]+)审", RegexOptions.IgnoreCase);
evaluateUser = reg7.Match(fileContent).Groups[].Value.Trim();//现场评估doc.Paragraphs[13].Range.Text
Regex reg8 = new Regex("[\\d|\\s]+年[\\d|\\s]+月[\\d|\\s]+日", RegexOptions.IgnoreCase);
evaluateDate = reg8.Match(fileContent).Value.Trim();//doc.Paragraphs[15].Range.Text.Trim()时间

四转EXCEL,网上很多人都是用datagrid直接转EXCEL,但是程序人生的朋友说这样只能倒出第一页的数据,不适合他要的程序;

DataTable dt = GetAllData();
StringWriter sw = new StringWriter();
sw.WriteLine("序号\t委托方\t产权人\t产权证号\t房屋座落\t建筑面积(平方米)\t建成年代\t层次/层数\t使用性质\t评估单价(元/平方米)\t评估总价值(元)\t现场评估人员\t评估日期\t备注"); if (dt != null)
{
foreach (DataRow dr in dt.Rows)
{
sw.WriteLine(dr["id"] + "\t" + dr["userName"] + "\t" + dr["propertyUser"] + "\t" + dr["propertyNo"] + "\t" +
dr["HouseAddr"] + "\t" + dr["buildArea"] + "\t" + dr["buildYear"] + "\t" + dr["buildCount"] + "\t" +
dr["userKind"] + "\t" + dr["buildUnitPrice"] + "\t" + dr["buildCountPrice"] + "\t" + dr["evaluateUser"]
+ "\t" + dr["evaluateDate"] + "\t" + "");
}
}
sw.Close();
Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls");
Response.ContentType = "application/excel";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
Response.Write(sw);
Response.End();

五,KILL进程,我在查看WORD里EXCEL里的数据的时候,无法关闭EXCEL,需要用程序来关闭;

public void KillProcess(string processName)
{
System.Diagnostics.Process myproc = new System.Diagnostics.Process();
//得到所有打开的进程
try
{
foreach (Process thisproc in Process.GetProcessesByName(processName))
{
if (!thisproc.CloseMainWindow())
{
if (thisproc != null)
thisproc.Kill();
}
}
}
catch (Exception Exc)
{
throw Exc;
// msg.Text+= "杀死" + processName + "失败!";
}
}

大家有空去程序人生 看看,很好的文章 。

C#调用WORD处理的实例代码(包含excel)的更多相关文章

  1. python中调用httpclient接口的实例代码

    #coding=utf-8 import httplib,urllib #get调用 httpClient=None try: params=urllib.urlencode({'account':' ...

  2. jquery ajax jsonp跨域调用实例代码

    今天研究了AJAX使用JSONP进行跨域调用的方法,发现使用GET方式和POST方式都可以进行跨域调用,这里简单分享下,方便需要的朋友 客户端代码 复制代码 代码如下: <%@ Page Lan ...

  3. 服务器端调用Word组件读取Word权限、未将对象引用到对象实例终极解决方案

    最近因为业务需要,需要在服务器上调用Word组件,结果遇到各种问题,比如检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件失败 ...

  4. python3.4学习笔记(二十五) Python 调用mysql redis实例代码

    python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...

  5. python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码

    python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码 淘宝IP地址库 http://ip.taobao.com/目前提供的服务包括:1. 根据用户提供的 ...

  6. jQuery Ajax方法调用 Asp.Net WebService、WebMethod 的详细实例代码

    将以下html存为ws.aspx <%@ Page Language="C#" AutoEventWireup="true" %> <scri ...

  7. VBA嘘嘘嘘(1)——将Excel数据填入到已存在的Word模板表格(实例应用)

    傻瓜可以写出机器读懂得代码,但写出让人能读懂的代码的是优秀程序员 Sub 填充() Application.ScreenUpdating = False 'ScreenUpdating 是控制你的ex ...

  8. C#开发中使用Npoi操作excel实例代码

    C#开发中使用Npoi操作excel实例代码 出处:西西整理 作者:西西 日期:2012/11/16 9:35:50 [大 中 小] 评论: 0 | 我要发表看法 Npoi 是什么? 1.整个Exce ...

  9. directshow 虚拟摄像头 实例 代码解读

    directshow 虚拟摄像头 实例 代码解读 本文只介绍这个源码的大致构成以及怎么修改,因为其他的我也不会啊哈哈哈,我就是用QQ调用虚拟摄像头读取我自己的视频或者图片播放给别人让别人以为这就是实时 ...

随机推荐

  1. Java泛型的好处

       java 泛型是java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. ...

  2. MySQL 5.6 复制:GTID 的优点和限制(第一部分)

    全局事务标示符(Global Transactions Identifier)是MySQL 5.6复制的一个新特性.它为维护特定的复制拓扑结构下服务器的DBA们大幅度改善他们的工作状况提供了多种可能性 ...

  3. hdu 3047 Zjnu Stadium(加权并查集)2009 Multi-University Training Contest 14

    题意: 有一个运动场,运动场的坐席是环形的,有1~300共300列座位,每列按有无限个座位计算T_T. 输入: 有多组输入样例,每组样例首行包含两个正整数n, m.分别表示共有n个人,m次操作. 接下 ...

  4. ArcMap自定义脚本工具制作

    原文 ArcMap自定义脚本工具制作 在制图的前期,一般需要做一些数据的整理,如图层合并.裁剪等工作.虽然在ArcMap中也有提供对应的工具,但使用起来需要点技巧.如批量裁剪,虽然可以实现,但出来的结 ...

  5. java web 学习七(HttpServletResponse对象1)

    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...

  6. 36、Android Bitmap 全面解析

    Android Bitmap 全面解析(一)加载大尺寸图片 http://www.eoeandroid.com/thread-331669-1-1.html Android Bitmap 全面解析(二 ...

  7. android sensor传感器系统架构初探

    http://blog.csdn.net/qianjin0703/article/details/5942579 http://blog.chinaunix.net/uid-28621021-id-3 ...

  8. bzoj4578: [Usaco2016 OPen]Splitting the Field

    2365: Splitting the Field 题意:n个点,求用两个矩形面积覆盖完所有点和一个矩形覆盖完少多少面积 思路:枚举两个矩形的分割线,也就是把所有点分成两个部分,枚举分割点:先预处理每 ...

  9. win7旗舰版通知windows不是正版副本解决方法

    原文转载http://www.cnblogs.com/simple_666/archive/2013/04/13/win7%E6%97%97%E8%88%B0%E7%89%88%E9%80%9A%E7 ...

  10. Java中Runnable和Thread的区别(转)

    http://developer.51cto.com/art/201203/321042.htm 第一种方式:使用Runnable接口创建线程 第二种方式:直接继承Thread类创建对象 使用Runn ...