最近給公司做個項目,要求每天全自動的根據(jù)一份Excel模版(帶圖片)把數(shù)據(jù)庫中的數(shù)據(jù)自動添加進入相關cell中,并要求不同產(chǎn)品生成不同文件,同一產(chǎn)品不同型號生成不同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"中設定了自動執(zhí)行
{
timer1.Interval =int.Parse(this.textBox1.text.ToString ());
timer1.Start();
}
}
ini_read(string strName,int intSum)是我自己的讀ini方法
2.根據(jù)條件生成DataSet....這個簡單不寫了
3.邦定到一個dataGrid1上
4.建立Excel文件
得到產(chǎn)品名同型號名,用DataView來實現(xiàn):
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就是一個產(chǎn)品的名,也是要做為文件名稱的,intdvParameterS是dv中這個產(chǎn)品開始的index,intdvParameterE是dv中這個產(chǎn)品的最后一個index,intSheetTotal就是dv中這個產(chǎn)品的總數(shù)
在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 );
用數(shù)組添加值吧,主要用for作循環(huán)
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中設定的數(shù)據(jù)庫中字段
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);
好了,循環(huán)添加完了后,保存就行了了,這樣一個產(chǎn)品名稱的Excel文件都完成了,里面有多個不同型號的Sheet,如果查詢出來的是多個產(chǎn)品,那么就循環(huán)調用GetTemplate()就可以了
5.其他都簡單
發(fā)郵件用
using System.Web.Mail ;
附件讀剛才那個listBox1就可以了
文件夾操作用
string strPath;
strPath=this.textBox2 .Text ;
System.IO.Directory.Delete(strPath,true);
Directory.CreateDirectory (strPath);
嘿嘿,全刪除