C#实现把WORD文档内容保存到数据库
提供一个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,需要用程序来关闭