最近程序人生(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. 【转】pdf 中如何把几页缩小成一页打印

    我用的是Foxit PDF Reader,可以这样设置:文件-打印-打印处理下的页面排列选择“在每张纸上放置多页”-选择每页版数即可. 如果你用的是Adobe Reader,也可以自己找一下,看是否有 ...

  2. Informatica元数据库解析

    Informatica所有的元数据信息均以数据库表的方式存到了元数据库中.当然Infa本身工具提供了很多的人性化的功能,使我们在开发时可以很方便的进行操作,但人们的需求总是万变的,需要方便的取到自己需 ...

  3. Web自动化框架搭建——前言

    1.web测试功能特性 a.功能逻辑测试(功能测试),这一块所有系统都是一致的,比如数据的添加.删除.修改:功能测试案例设计感兴趣和有时间的话可以另外专题探讨: b.浏览器兼容性测试,更重要的是体验这 ...

  4. 仿酷狗音乐播放器开发日志二十五 duilib右键事件的不足的bug修复

    转载请说明原出处,谢谢~~ 虽然仿酷狗的各个菜单早就写好了,但是一直没有附加到程序里.今天把菜单和播放列表控件关联时发现了问题. 和播放列表相关的菜单有三个,分别是每个音乐项目控件相关的菜单.分组的菜 ...

  5. C++实现网格水印之调试笔记(五)—— 提取出错

    在实现提取水印的过程中,遇到了一些问题 首先还是根据论文中的思路来梳理一下整个提取流程 读入两个模型,一个原始模型ori_mesh, 一个水印模型wm_mesh. 将两个模型对齐(即放在同一个坐标系下 ...

  6. 通过简单的Linux内核启动程序代码窥探操作系统的启动原理

    作者:吴乐  山东师范大学 <Linux内核分析> 孟宁 MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.程序设计与分析 ...

  7. android Loger日志类(获取内置sd卡)

    Android手机自带内部存储路径的获取 原文地址:http://my.oschina.net/liucundong/blog/288183 直接贴代码: public static String g ...

  8. Unity3D-美术相关

    1.导入动画 (1)使用预分解的动画模型,导入后面板中会含有一个可用的动画片段列表. (2)使用未分解的动画模型,自行添加动画片段. (3)使用多个动画文件,模型与动画分离.对于goober.fbx模 ...

  9. 【转】nginx的优缺点

    原博文出自于:http://blog.csdn.net/a454211787/article/details/22494485     感谢! 1.nginx相对于apache优点: 轻量级同样起we ...

  10. ColorNote[动态][log]

    Windows 应用商店上传日志 [ColorNote In Windows APP Store Log]: ColorNote v1.0 2012/12/2 ColorNote v1.1 2012/ ...