c#生成多个worksheet的excel模板

最近给公司做个项目,要求每天全自动的根据一份Excel模版(带图片)把数据库中的数据自动添加进入相关cell中,并要求不同产品生成不同文件,同一产品不同型号生成不同Sheets...还要自动把当天生成的这些Excel文件自动邮件给指定客人...
恩恩,这就是自动化...
用了两个星期做完...下面说下关键的处理,给同样要做的朋友一些帮助:
1.要自动化,就需要用ini文件
加入:
  [DllImport("kernel32")]
  private static extern long WritePrivateProfileString(string section,string key,string val,string filePath);
  [DllImport("kernel32")]
  private static extern int GetPrivateProfileString(string section,string key,string def,StringBuilder retVal,int size,string filePath);

另外要加个Timer1,程序启动的时候读ini文件,确定是否需要哪些自动化,对Timer1的延时需要也在ini文件中设定:
private void Form1_Load(object sender, System.EventArgs e)
  {
 
   ini_read("Setup",7);
   ini_read("Parameter",55);
   ini_read("Email",9);
   if (this.checkBox1.Checked ==true) //判断是否"Setup"中设定了自动执行
   {
    timer1.Interval =int.Parse(this.textBox1.text.ToString ());
    timer1.Start();
   }     
  }
ini_read(string strName,int intSum)是我自己的读ini方法

2.根据条件生成DataSet....这个简单不写了
3.邦定到一个dataGrid1上
4.建立Excel文件
得到产品名同型号名,用DataView来实现:
DataView dv=new DataView ();
dv=((DataSet)dataGrid1.DataSource).Tables [0].DefaultView ;

调用生成一个Excel文件的方法:
public void GetTemplate(string strFileName,DataView dv,int intdvParameterS,int intdvParameterE,int intSheetTotal)
GetTemplate(strProductID,dv,(intEnd-intSheetTotal),intEnd,intSheetTotal+1);
解释下,strFileName就是一个产品的名,也是要做为文件名称的,intdvParameterS是dv中这个产品开始的index,intdvParameterE是dv中这个产品的最后一个index,intSheetTotal就是dv中这个产品的总数

在GetTemplate中要添加模版,拷贝模版给多个Sheet,保存文件:
调用放在\Template文件夹下的template.xls文件,
Microsoft.Office.Interop.Excel.Application objEa; 
objEa.Workbooks.Add(((System.Environment.CurrentDirectory.Replace("\\","\\\\"))+"\\\\"+"Template\\template.xls"));

生成intSheetTotal个Sheet....

拷贝模版到Sheet
Microsoft.Office.Interop .Excel .Worksheet objEs;
objEs.Copy (objEa.Workbooks[1].Worksheets[1] ,Missing.Value );

用数组添加值吧,主要用for作循环
Microsoft.Office .Interop .Excel .Range[] objEr=new Microsoft.Office .Interop .Excel .Range[30];
objEr[i]=objEs.get_Range(strPara[i],Missing.Value);
objEr[i].Value2 =dv[intdvParameterS+k-1].Row[strField[i]].ToString(); 
strField[i]是ini中设定的数据库中字段
strPara[i]是ini中设定的Excel中位置,比如strField[0]="ProductID",strPara[0]="C22"
...
 string  strName=strFileName;
 string  strFolder=this.textBox2.Text+"\\"+strName+".xls"; //textBox2是文件夹路径
   this.listBox1.Items .Add(strFolder);//这是把这个Excel文件作为邮件附件添加进附件List中处理
objEa.Workbooks[1].SaveCopyAs(strFolder);

好了,循环添加完了后,保存就行了了,这样一个产品名称的Excel文件都完成了,里面有多个不同型号的Sheet,如果查询出来的是多个产品,那么就循环调用GetTemplate()就可以了

5.其他都简单
发邮件用
using System.Web.Mail ;
附件读刚才那个listBox1就可以了
文件夹操作用
   string strPath;
   strPath=this.textBox2 .Text ;
   System.IO.Directory.Delete(strPath,true);
   Directory.CreateDirectory (strPath);
嘿嘿,全删除

恩恩,做完

posted on 2006-05-14 20:29  破茧化蝶  阅读(5074)  评论(2编辑  收藏  举报

导航