C#也能动态生成Word文档并填充数据, 导出EXCEL 方法

  要使用C#操作word,首先要添加引用: 
       1、添加引用->COM->Microsoft Word 11.0 Object Library

       2、在.cs文件中添加

using Word;
下面的例子中包括C#对Word文档的创建、插入表格、设置样式等操作:

(例子中代码有些涉及数据信息部分被省略,重要是介绍一些C#操作word文档的方法)

        public string CreateWordFile(string CheckedInfo)
        ...{
            string message = "";
            try
            ...{
                Object Nothing = System.Reflection.Missing.Value;
                Directory.CreateDirectory("C:/CNSI");  //创建文件所在目录
                string name = "CNSI_" + DateTime.Now.ToShortString()+".doc";
                object filename = "C://CNSI//" + name;  //文件保存路径
                //创建Word文档
                Word.Application WordApp = new Word.ApplicationClass();
                Word.Document WordDoc = WordApp.Documents.Add(ref Nothing, ref Nothing, ref Nothing, ref Nothing);

                //添加页眉
                WordApp.ActiveWindow.View.Type = WdViewType.wdOutlineView;
                WordApp.ActiveWindow.View.SeekView = WdSeekView.wdSeekPrimaryHeader;
                WordApp.ActiveWindow.ActivePane.Selection.InsertAfter("[页眉内容]");
                WordApp.Selection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight;//设置右对齐
                WordApp.ActiveWindow.View.SeekView = WdSeekView.wdSeekMainDocument;//跳出页眉设置

                WordApp.Selection.ParagraphFormat.LineSpacing = 15f;//设置文档的行间距

                //移动焦点并换行
                object count = 14;
                object WdLine = Word.WdUnits.wdLine;//换一行;
                 WordApp.Selection.MoveDown(ref WdLine, ref count, ref Nothing);//移动焦点
                 WordApp.Selection.TypeParagraph();//插入段落

                 //文档中创建表格
                 Word.Table newTable = WordDoc.Tables.Add(WordApp.Selection.Range, 12, 3, ref Nothing, ref Nothing);
                 //设置表格样式
                 newTable.Borders.OutsideLineStyle = Word.WdLineStyle.wdLineStyleThickThinLargeGap;
                 newTable.Borders.InsideLineStyle = Word.WdLineStyle.wdLineStyleSingle;
                 newTable.Columns[1].Width = 100f;
                 newTable.Columns[2].Width = 220f;
                 newTable.Columns[3].Width = 105f;

                 //填充表格内容
                 newTable.Cell(1, 1).Range.Text = "产品详细信息表";
                 newTable.Cell(1, 1).Range.Bold = 2;//设置单元格中字体为粗体
                 //合并单元格
                 newTable.Cell(1, 1).Merge(newTable.Cell(1, 3));
                 WordApp.Selection.Cells.VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;//垂直居中
                 WordApp.Selection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;//水平居中
                        
                 //填充表格内容
                 newTable.Cell(2, 1).Range.Text = "产品基本信息";
                 newTable.Cell(2, 1).Range.Font.Color = Word.WdColor.wdColorDarkBlue;//设置单元格内字体颜色
                 //合并单元格
                 newTable.Cell(2, 1).Merge(newTable.Cell(2, 3));
                 WordApp.Selection.Cells.VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;

                  //填充表格内容
                  newTable.Cell(3, 1).Range.Text = "品牌名称:";
                  newTable.Cell(3, 2).Range.Text = BrandName;
                  //纵向合并单元格
                  newTable.Cell(3, 3).Select();//选中一行
                  object moveUnit = Word.WdUnits.wdLine;
                  object moveCount = 5;
                  object moveExtend = Word.WdMovementType.wdExtend;
                   WordApp.Selection.MoveDown(ref moveUnit, ref moveCount, ref moveExtend);
                   WordApp.Selection.Cells.Merge();
                   //插入图片
                   string FileName = Picture;//图片所在路径
                   object LinkToFile = false;
                   object SaveWithDocument = true;
                   object Anchor = WordDoc.Application.Selection.Range;
                   WordDoc.Application.ActiveDocument.InlineShapes.AddPicture(FileName, ref LinkToFile, ref SaveWithDocument, ref Anchor);
                    WordDoc.Application.ActiveDocument.InlineShapes[1].Width = 100f;//图片宽度
                    WordDoc.Application.ActiveDocument.InlineShapes[1].Height = 100f;//图片高度
                    //将图片设置为四周环绕型
                    Word.Shape s = WordDoc.Application.ActiveDocument.InlineShapes[1].ConvertToShape();
                    s.WrapFormat.Type = Word.WdWrapType.wdWrapSquare;
                        
                    newTable.Cell(12, 1).Range.Text = "产品特殊属性";
                    newTable.Cell(12, 1).Merge(newTable.Cell(12, 3));
                     //在表格中增加行
                     WordDoc.Content.Tables[1].Rows.Add(ref Nothing);
                      
                     WordDoc.Paragraphs.Last.Range.Text = "文档创建时间:" + DateTime.Now.ToString();//“落款”
                     WordDoc.Paragraphs.Last.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight;

                    //文件保存
                    WordDoc.SaveAs(ref filename, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing);
                    WordDoc.Close(ref Nothing, ref Nothing, ref Nothing);
                    WordApp.Quit(ref Nothing, ref Nothing, ref Nothing);
                    message=name+"文档生成成功,以保存到C:CNSI下";
            }
            catch
            ...{
                message = "文件导出异常!";
            }
            return message;
        }



是用WPF将数据导出成EXCEL其实和其他.NET应用是相通的,ASP.NET也好WINFORM也好,都是用相同的方法实现,唯一不同的是ASP.NET中可能会存在用户权限的问题,毕竟ASP.NET的执行用户是IIS指定的用户而不是默认的系统用户。

 

具体实现方法如下,代码中使用完整的名称空间,便于理解

 

第一步,不许引用Excel的程序集,不同于网上其他文章,我直接引用了.NET里的Microsoft.Office.interop.Excel ,而不是在Com里引用Microsoft Excel ,安装好VS08或.NET框架包以后 .NET本身就有这个程序集,不用去引用系统中安装的OFFICE的程序集,当然两种引用都是相同效果的。

 

然后就可以直接编写代码了

 

 

            DataOperation dataop = new DataOperation();

 

            DataView dv = dataop.OpertaionsGet(); //获得一个dataview,这是我的程序里的方法,这里可以随便获得任何一个dataview或者其他数据集合sheet

 

            dataop.Clear();

 

 

            Microsoft.Office.Interop.Excel.ApplicationClass ac = new Microsoft.Office.Interop.Excel.ApplicationClass();

           

            Microsoft.Office.Interop.Excel.Workbook wb ; //这里千万不能使用 new 来实例对象,不然会异常

 

            Microsoft.Office.Interop.Excel.Worksheet ws ;

 

 

 

 

            wb = ac.Workbooks.Add(System.Reflection.Missing.Value);  //创建工作簿(WorkBook:即Excel文件主体本身)

            ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets.Add(System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value);        //创建工作表(Worksheet:工作表,即Excel里的子表sheet)

 

            //设置表名

            ws.Name = "TestXlS";

 

            //将数据导入到工作表的单元格

            for (int i = 0; i < dv.Count; i++)

            {

                for(int j=0;j<dv.Table.Columns.Count;j++)

                ws.Cells[i+1,j+1]= dv[i][j].ToString();

            }

 

            //保存到文件

            wb.SaveAs("D://aa1.xls", System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value);

 

            //关闭

            wb.Close(System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value);

 

 

其实很简单,如同将一个数据表格导入到另一个数据表格一样,只需要注意Excel的方法中的参数。

 

本示例中,大部分参数都采用缺省,System.Reflection.Missing.Value,在保存方法中只有第1个参数必须是完整保存路径字符串和第7个参数是XlSaveAsAccessMode枚举。

 

还有一个必须要注意的地方,WorkSheet单元Cell的索引是从1开始的,不同于我们习惯的从0开始,因此在Cells二维数组中代码是ws.Cells[i+1,j+1]这个样的。

 

最后,关闭工作表 ,这个容易理解,否者,保存的文件将一直被Excel进程占用。

 

另外有时候数字文本会被用科学计数法显示,格式化数字为文本的方法是

ws.Cells.NumberFormat = "@";

转载:http://www.cnblogs.com/ZetaChow/archive/2010/06/01/2237333.html
展开阅读全文

没有更多推荐了,返回首页