分享

调用Excel模版后根据自定义数据库字段同cell定位生成多Sheet的Excel文件...

 COPY&PASTE 2009-10-04

最近给公司做个项目,要求每天全自动的根据一份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);
嘿嘿,全删除  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约