C#实现把WORD文档内容保存到数据库

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

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

房地产价值监证确认书

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

邓征兵 :

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

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

确认房屋价值如下表:

这里有个EXCEL表格

监证目的:交易课税

备注:

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

现场评估:黄生忠

审 批:

 2009 年 2 月 10 日

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

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

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

Code

1 Microsoft.Office.Interop.Word.ApplicationClass wordApp = new Microsoft.Office.Interop.Word.ApplicationClass();

2 object file = nam;

3 object nullobj = System.Reflection.Missing.Value;

4 try

5 {

6 Microsoft.Office.Interop.Word.Document doc = wordApp.Documents.Open(

7 ref file, ref nullobj, ref nullobj,

8 ref nullobj, ref nullobj, ref nullobj,

9 ref nullobj, ref nullobj, ref nullobj,

10 ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj);

11 //doc.ActiveWindow.Selection.WholeStory();

12

13 //doc.ActiveWindow.Selection.Copy();

14 //IDataObject data = Clipboard.GetDataObject();

15

16 fileContent = doc.Content.Text; //这里读取所有的WORD里的文本

17 }

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

Code

1 foreach (Microsoft.Office.Interop.Word.InlineShape ish in doc.InlineShapes)

2 {

3 if (ish.Type == Microsoft.Office.Interop.Word.WdInlineShapeType.wdInlineShapeEmbeddedOLEObject)

4 {

5 if (ish.OLEFormat.ProgID == "Excel.Sheet.8")

6 {

7 //ish.OLEFormat.DoVerb(ref nullobj);

8 ish.OLEFormat.Activate();

9 Microsoft.Office.Interop.Excel.Workbook objEXl = (Microsoft.Office.Interop.Excel.Workbook)ish.OLEFormat.Object;

10 buildArea = ((objEXl.Worksheets[1] as Microsoft.Office.Interop.Excel.Worksheet).Cells[2, 2] as Microsoft.Office.Interop.Excel.Range).Text.ToString();

11 if (buildArea != "")

12 {

13 buildUnitPrice = ((objEXl.Worksheets[1] as Microsoft.Office.Interop.Excel.Worksheet).Cells[2, 3] as Microsoft.Office.Interop.Excel.Range).Text.ToString();

14 buildCountPrice = ((objEXl.Worksheets[1] as Microsoft.Office.Interop.Excel.Worksheet).Cells[2, 4] as Microsoft.Office.Interop.Excel.Range).Text.ToString();

15 userKind = "住宅";

16 }

17 else

18 {

19 buildArea = ((objEXl.Worksheets[1] as Microsoft.Office.Interop.Excel.Worksheet).Cells[3, 2] as Microsoft.Office.Interop.Excel.Range).Text.ToString();

20 buildUnitPrice = ((objEXl.Worksheets[1] as Microsoft.Office.Interop.Excel.Worksheet).Cells[3, 3] as Microsoft.Office.Interop.Excel.Range).Text.ToString();

21 buildCountPrice = ((objEXl.Worksheets[1] as Microsoft.Office.Interop.Excel.Worksheet).Cells[3, 4] as Microsoft.Office.Interop.Excel.Range).Text.ToString();

22 userKind = "非住宅";

23 }

24 objEXl.Application.Quit();

25 }

26 }

27 }

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

Code

1 Regex reg1 = new Regex("[\u4E00-\u9FFF]+", RegexOptions.IgnoreCase);

2 userName = reg1.Match(doc.Paragraphs[4].Range.Text).Value.Trim();//委托人

3 Regex reg2 = new Regex("评估人员对位于([\\S|\\s]+)的房地产", RegexOptions.IgnoreCase);

4 HouseAddr = reg2.Match(fileContent).Groups[1].Value.Trim();//房子地址doc.Paragraphs[5].Range.Text

5 Regex reg3 = new Regex("号为([\\S|\\s]+),房屋所有权人", RegexOptions.IgnoreCase);

6 propertyNo = reg3.Match(fileContent).Groups[1].Value.Trim();//房产证号doc.Paragraphs[5].Range.Text

7 Regex reg4 = new Regex("房屋所有权人([\\S|\\s]+)房屋所在层次", RegexOptions.IgnoreCase);

8 propertyUser = reg4.Match(fileContent).Groups[1].Value.Trim();//房屋所有权人doc.Paragraphs[5].Range.Text

9 Regex reg5 = new Regex("层次/总层数([\\S|\\s]+),进行了现场勘估", RegexOptions.IgnoreCase);

10 buildCount = reg5.Match(fileContent).Groups[1].Value.Trim();//层次/总层数doc.Paragraphs[5].Range.Text

11 Regex reg6 = new Regex("建成年代为([\\S|\\s]+),成新度为", RegexOptions.IgnoreCase);

12 buildYear = reg6.Match(fileContent).Groups[1].Value.Trim();//建成年代doc.Paragraphs[6].Range.Text

13 Regex reg7 = new Regex("现场评估:([\\S|\\s]+)审", RegexOptions.IgnoreCase);

14 evaluateUser = reg7.Match(fileContent).Groups[1].Value.Trim();//现场评估doc.Paragraphs[13].Range.Text

15 Regex reg8 = new Regex("[\\d|\\s]+年[\\d|\\s]+月[\\d|\\s]+日", RegexOptions.IgnoreCase);

16 evaluateDate = reg8.Match(fileContent).Value.Trim();//doc.Paragraphs[15].Range.Text.Trim()时间

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

Code

1 public void KillProcess(string processName)

2 {

3 System.Diagnostics.Process myproc = new System.Diagnostics.Process();

4 //得到所有打开的进程

5 try

6 {

7 foreach (Process thisproc in Process.GetProcessesByName(processName))

8 {

9 if (!thisproc.CloseMainWindow())

10 {

11 if (thisproc != null)

12 thisproc.Kill();

13 }

14 }

15 }

16 catch (Exception Exc)

17 {

18 throw Exc;

19 // msg.Text+= "杀死" + processName + "失败!";

20 }

21 }

详细技术点请下载我的代码,点这里下载

Code

1 DataTable dt = GetAllData();

2 StringWriter sw = new StringWriter();

3 sw.WriteLine("序号\t委托方\t产权人\t产权证号\t房屋座落\t建筑面积(平方米)\t建成年代\t层次/层数\t使用性质\t评估单价(元/平方米)\t评估总价值(元)\t现场评估人员\t评估日期\t备注");

4 if (dt != null)

5 {

6 foreach (DataRow dr in dt.Rows)

7 {

8 sw.WriteLine(dr["id"] + "\t" + dr["userName"] + "\t" + dr["propertyUser"] + "\t" + dr["propertyNo"] + "\t" +

9 dr["HouseAddr"] + "\t" + dr["buildArea"] + "\t" + dr["buildYear"] + "\t" + dr["buildCount"] + "\t" +

10 dr["userKind"] + "\t" + dr["buildUnitPrice"] + "\t" + dr["buildCountPrice"] + "\t" + dr["evaluateUser"]

11 + "\t" + dr["evaluateDate"] + "\t" + "");

12 }

13 }

14 sw.Close();

15 Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls");

16 Response.ContentType = "application/excel";

17 Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");

18 Response.Write(sw);

19 Response.End();

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