一、word

这是我以前工作时写过的一个业务逻辑处理类,里面有不少文件操作的方法,这里主要关注一下C#对word的操作。里面的方法可以直接拿出来用,主要是通过word的dot模版来进行创建word、替换word等操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
namespace  Excel2Word
{
     public  class  BLL
     {
         private  Microsoft.Office.Interop.Word.Application app =  null ; //全局变量 word应用程序
                         
         /// <summary>
         /// 从Excel中读取数据
         /// </summary>
         /// <param name="excelPath"></param>
         /// <param name="sheetName"></param>
         /// <returns></returns>
         public  static  DataSet GetDataFromExcel( string  excelPath,  string  sheetName)
         {
             DataSet ds =  new  DataSet();
             string  strConn =  "Provider=Microsoft.Jet.OleDb.4.0; Data Source="  + excelPath.ToString().Trim() +  "; Extended Properties=Excel 8.0;" ;
                         
             try
             {
                 using  (OleDbConnection conn =  new  OleDbConnection(strConn))
                 {
                     conn.Open();
                         
                     OleDbDataAdapter oda =  new  OleDbDataAdapter( "select * from ["  + sheetName +  "]" , conn);
                     oda.Fill(ds);
                 }
             }
             catch
             {
                 throw  new  Exception( "获取Excel数据时发生异常..." );
             }
             return  ds;
         }
                               
         /// <summary>
         /// Word文本替换
         /// </summary>
         /// <param name="doc">文档</param>
         /// <param name="args">要替换的内容</param>
         public  void  ReplaceWord(Document doc, Dictionary< string string > args)
         {
             try
             {
                 object  first = 0;
                 object  last = doc.Characters.Count;
                 Range range = doc.Range( ref  first,  ref  last);
                         
                 Microsoft.Office.Interop.Word.Find finder = range.Find;
                 finder.ClearFormatting();
                         
                 object  missingValue = Type.Missing;
                 object  replaceArea = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll;
                         
                 foreach  ( var  item  in  args)
                 {
                     object  findStr =  "{"  + item.Key.Trim() +  "}" ;
                     object  replaceStr = item.Value.Trim();
                         
                     //替换内容
                     finder.Execute( ref  findStr,  ref  missingValue,  ref  missingValue,
                       ref  missingValue,  ref  missingValue,  ref  missingValue,
                       ref  missingValue,  ref  missingValue,  ref  missingValue,
                       ref  replaceStr,  ref  replaceArea,  ref  missingValue,
                       ref  missingValue,  ref  missingValue,  ref  missingValue);
                 }
             }
             catch
             {
                 return ;
             }
         }
                         
                         
         /// <summary>
         /// word文档资源释放
         /// </summary>
         /// <param name="doc">要释放资源的文档</param>
         public  void  DisposeWord(Document doc)
         {
             try
             {
                 object  oMissing = System.Reflection.Missing.Value;
                         
                 if  (doc !=  null )
                 {
                     //关闭Word并回收资源
                     doc.Close( ref  oMissing,  ref  oMissing,  ref  oMissing);
                     System.Runtime.InteropServices.Marshal.ReleaseComObject(doc);
                     doc =  null ;
                 }
                         
                 if  (app !=  null )
                 {
                     app.Quit( ref  oMissing,  ref  oMissing,  ref  oMissing);
                     System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
                     app =  null ;
                     GC.Collect();
                 }
             }
             catch
             {
                 return ;
             }
         }
                         
         /// <summary>
         /// 从模板创建Word文件
         /// </summary>
         /// <param name="fileName">模板位置及名称</param>
         /// <returns></returns>
         public  Document CreateWord( string  fileName,  string  dsr)
         {
             try
             {
                 app =  new  Microsoft.Office.Interop.Word.Application(); //打开word程序
                 Document doc =  new  Document(); //创建word对象
                 object  unknow = Type.Missing;
                 string  date = DateTime.Now.ToShortDateString();
                 object  savefilename =  @"D:\"  + dsr + ".doc"; //保存路径
                 object  File = fileName;
                 app.Visible =  false ; //设置word程序为不可见
                 doc = app.Documents.Open( ref  File,
                 ref  unknow,  ref  unknow,  ref  unknow,  ref  unknow,  ref  unknow,
                 ref  unknow,  ref  unknow,  ref  unknow,  ref  unknow,  ref  unknow,
                 ref  unknow,  ref  unknow,  ref  unknow,  ref  unknow,  ref  unknow); //打开word文档
                         
                 doc.SaveAs( ref  savefilename,  ref  unknow,  ref  unknow,  ref  unknow,  ref  unknow,  ref  unknow,  ref  unknow,  ref  unknow,  ref  unknow,  ref  unknow,  ref  unknow,  ref  unknow,  ref  unknow,  ref  unknow,  ref  unknow,  ref  unknow); //保存word文档
                         
                 return  doc;
             }
             catch
             {
                 return  null ;
             }
         }
     }
}

二、excel

webform中,导出excel的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public  void  ExportResult(DataTable dt,  string  excelName)
{
     Response.Clear();
     Response.Charset =  "" ;
     Response.ContentType =  "applicationnd.ms-xls" ;
     StringWriter sw =  new  StringWriter();
     HtmlTextWriter htmlWrite =  new  HtmlTextWriter(sw);
                     
     DataGrid dg =  new  DataGrid();
     dg.DataSource = dt;
     dg.DataBind();
     dg.RenderControl(htmlWrite);
     Response.AddHeader( "content-disposition" "attachment;filename="  + HttpUtility.UrlEncode(excelName));
     Response.Write(sw.ToString());
     Response.End();
}

如果遇到身份证等类型的字段,由于科学计数法的原因导出excel之后很可能会“截断”,因此有必要对这种长整型的字段进行处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/// <summary>
/// 过滤低位非打印字符
/// </summary>
/// <param name="tmp"></param>
/// <returns></returns>
private  string  ReplaceLowOrderASCIICharacters( string  tmp)
{
     StringBuilder info =  new  StringBuilder();
     foreach  ( char  cc  in  tmp)
     {
         int  ss = ( int )cc;
         if  (((ss >= 0) && (ss <= 8)) || ((ss >= 11) && (ss <= 12)) || ((ss >= 14) && (ss <= 32)))
             info.AppendFormat( " " , ss);
         else  info.Append(cc);
     }
     return  info.ToString();
}

winform中,客户端生成excel的代码:

前提是要安装office,原理是通过office进程生成excel文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/// <summary>
/// 从DataSet生成Excel
/// </summary>
/// <param name="ds">DataSet</param>
/// <param name="strExcelFileName">文件名</param>
public  void  ExportExcelByDataSet(DataSet ds,  string  strExcelFileName)
{
     Microsoft.Office.Interop.Excel.Application excel =  new  Microsoft.Office.Interop.Excel.Application();
            
     int  rowIndex = 1;
     int  colIndex = 0;
            
     excel.Application.Workbooks.Add( true );
            
     DataTable dt = ds.Tables[0];
     foreach  (DataColumn col  in  dt.Columns)
     {
         colIndex++;
         excel.Cells[1, colIndex] = col.ColumnName;
     }
            
     foreach  (DataRow row  in  dt.Rows)
     {
         rowIndex++;
         colIndex = 0;
            
         foreach  (DataColumn col  in  dt.Columns)
         {
             colIndex++;
             excel.Cells[rowIndex, colIndex] = row[col.ColumnName].ToString();
         }
     }
            
     excel.Visible =  false ;
     excel.ActiveWorkbook.SaveAs(strExcelFileName +  ".XLS" , Microsoft.Office.Interop.Excel.XlFileFormat.xlExcel9795,  null null false false , Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,  null null null null null );
            
     excel.Quit();
     excel =  null ;
     GC.Collect();
}

三、pdf

搜索《PDF文件制作全攻略》,可以找到现成的资料,里面的代码和文档也相对比较齐全、清晰,这里简单做个示例demo——生成一个带章节的,内容为图片的pdf文档。

实现步骤:

1)在vs环境下新建项目,引用 ICSharpCode.SharpZipLib.dll、itextsharp.dll 这两个dll文件

2)在按钮事件下输入如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//设置版面为A4大小
Document document =  new  Document(PageSize.A4);
        
//创建一个test.pdf文件
PdfWriter.getInstance(document,  new  FileStream( "test.pdf" , FileMode.Create));
        
document.Open(); //打开pdf文档
        
try
{
     string [] images = Directory.GetFiles( "test/" );
        
     for  ( int  i = 0; i < images.Length; i++)
     {
         //定义章节
         Chapter chapter =  new  Chapter( new  Paragraph(images[i]), i + 1);
        
         //加入章节
         document.Add(chapter);
        
         //获得图片
         iTextSharp.text.Image tempImage = iTextSharp.text.Image.getInstance(images[i]);
        
         //设置图片大小为原图的70%
         tempImage.scalePercent(70);
        
         //文档加入图片
         document.Add(tempImage);
        
         //文档新建一页
         document.newPage();
     }
        
        
}
catch  (Exception ex)
{
     throw  ex;
}
document.Close(); //关闭pdf文档