C#是不是不能开发EXCEL的程序啊,大家看,问题太多了?? 那你的编译器坏了,我都不会出错,我也用过excel 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 打开运行:C:\WINNT\system32\dcomcnfg.exe配置DCOM将EXCEL的所以权限都放开,一切OK!但就是在创建EXCEL进程的时候有点慢,这点始终是个问题最后总结:机子好的导出EXCEL速度越快 我成功了,原是这样的:首先要引用microsoft.excel11.0 object library,然后要用下面的语名才能找个所要的方法using Excel = Microsoft.Office.Interop.Excel;在MSDN里这方面的帮助太少了,现在我还不知Excel.Range 的EntireColumn.AutoFit();什么意思呢? Excel.Range 的EntireColumn.AutoFit(); 自动调整列宽 5.0好象是不可以,我也试过。可能名称空间不是excel.高版就可以操作。我现在都是操作XML的,不过必须要XP或以上版本。好处就是不用担心COM释放问题,效率高,不过XML文件比SLX文件大很多。 Excel.Range 的EntireColumn.AutoFit() 自动调整列宽 /// <summary> /// 向EXCEL表格里插入数据库记录 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnExcel_Click(object sender, System.EventArgs e) { //查询数据库内容判断 AccFlage的值,如果其值是1则用'√'替换,如果是0则为空 string query_sql = "select AccDate,No,Abr_AccId,Abr_Content,Abr_Person,(select case when AccFlag = 1 then '√' when AccFlag = 0 then ''else ''end as 'AccFlag'),DbtAmt,CrdAmt,EndAmt from accounttype where accno = '" + cboNo.SelectedValue + "'and AccDate between '" + dateStart.Value.Date + "' and '" + dateEnd.Value.Date + "'"; SqlConnection con = new SqlConnection(ConStr); SqlDataAdapter da = new SqlDataAdapter(query_sql,con); DataSet ds = new DataSet(); da.Fill(ds,"accounttype"); string query = "select endamt from accounttype where id = '" + this.txtDate.Text + "'"; SqlDataAdapter daNow = new SqlDataAdapter(query,con); DataSet dsNow = new DataSet(); daNow.Fill(dsNow,"accounttype"); txtNow.DataBindings.Clear(); txtNow.DataBindings.Add("Text",dsNow,"AccountType.EndAmt"); string str; if(this.radioMoney.Checked) { str = "0"; } else { str = "1"; } if(str == "0") { string query_money = "select * from money where MoneyAttr = 2"; SqlDataAdapter damoney = new SqlDataAdapter(query_money,con); DataSet dsmoney = new DataSet(); damoney.Fill(dsmoney,"money"); txtMoney.DataBindings.Clear(); txtMoney.DataBindings.Add("Text",dsmoney,"Money.Money"); } else { string query_money = "select * from money where MoneyAttr = 3"; SqlDataAdapter damoney = new SqlDataAdapter(query_money,con); DataSet dsmoney = new DataSet(); damoney.Fill(dsmoney,"money"); txtMoney.DataBindings.Clear(); txtMoney.DataBindings.Add("Text",dsmoney,"Money.Money"); } string filename=""; //将模板文件复制到一个新文件中 SaveFileDialog mySave = new SaveFileDialog(); mySave.Filter="Excel文件(*.XLS)|*.xls|所有文件(*.*)|*.*"; if(mySave.ShowDialog()!=DialogResult.OK) { return; } else { filename = mySave.FileName; //将模板文件copy到新位置,建议实际开发时用相对路径,如Application.StartupPath.Trim()+"\\report\\normal.xls" FileInfo mode=new FileInfo(Application.StartupPath.Trim() + @"\Report\CashReport.xls"); try { mode.CopyTo(filename,true); } catch(Exception ex) { MessageBox.Show(ex.Message); return; } } //打开复制后的文件 object missing = Missing.Value; Excel.Application myExcel = new Excel.Application ( ); //打开新文件 myExcel.Application.Workbooks.Open(filename,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing); //将Excel显示出来 myExcel.Visible=true; //将列标题和实际内容选中 Excel.Workbook myBook = myExcel.Workbooks[1]; Excel.Worksheet mySheet = (Excel.Worksheet)myBook.Worksheets[1]; mySheet.Cells[2,5] = this.dateStart.Value.Date; mySheet.Cells[2,8] = this.dateEnd.Value.Date; mySheet.Cells[1,1] = "安徽省建行现金出纳统计表------" + this.cboNo.SelectedValue; //判断是否有余额,如果没有就把初期额添加入EXCEL中 if(this.txtDate.Text == "") { mySheet.Cells[5,9] = txtMoney.Text.ToString(); } else { mySheet.Cells[5,9] = txtNow.Text.ToString(); } //向EXCEL里插记录 int HeadLines=5; int j=0; for(int r = 0;r<ds.Tables[0].Rows.Count;r++) { if (((r+1) % 22)==0) { for(int i = 0;i<ds.Tables[0].Columns.Count;i++) { mySheet.Cells[j*2+r+HeadLines+1,i+1] = ds.Tables[0].Rows[r][i]; } mySheet.Cells[j*2+r+HeadLines+2,4] = "过次页"; mySheet.Cells[j*2+r+HeadLines+3,4] = "呈上页"; mySheet.Cells[j*2+r+HeadLines+3,9] = ds.Tables[0].Rows[r][8];; j++; } else { for(int i = 0;i<ds.Tables[0].Columns.Count;i++) { mySheet.Cells[j*2+r+HeadLines+1,i+1] = ds.Tables[0].Rows[r][i]; } } } }数据导入EXCEL没问题,你看看吧 我也关心怎么释放excel的问题。 EXCEL释放问题,我也关心,我试验发现在Excel Xp中不会有EXCEL释放不掉的问题,而在2003下就释放不掉了, cantops(劣等游民)你看看 EXCEL释放确实是个问题,用两个方法,一个方法foun1执行你的操作,并关闭,另外一个方法foun2:provate void foun2(){ foun1(); GC.Collect();//强行销毁} Microsoft.Office.Interop.Excel.Application myExcel=new Microsoft.Office.Interop.Excel.ApplicationClass(); Microsoft.Office.Interop.Excel.Worksheet mySheet=new Microsoft.Office.Interop.Excel.WorksheetClass(); myExcel.Visible=true; myExcel.Workbooks.Add(true);//这样写才对不能释放是应为你没有把引用都断开System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheets);System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);...System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);System.Runtime.InteropServices.Marshal.ReleaseComObject(range);worksheets=null;worksheet=null;...excelApp=null;range=null;把操作Excel文件用到的对象实例全部释放。然后资源回收!GC.Collect();//这样就能都释放了 EXCEL释放问题, 有没有用Sheet.Close()? local resource和project resource file的区别 C# 导出Excel的,导出时弹出保存对话框 请教实现方法 在线等一个改变图片对比度的算法 如何传递的问题? 求助 传 ref object 和传 object 的区别。 新手求助dataGridview 中的每一个格子中的数据如何取出? 请问sql中如何设置只显示日期的字段 oracle 回滚 CommandText = "ROLLBACK" 不可以 sqlserver可以。为什么 为什么Crystall Report 不能使用 请问怎样取得每个人发贴时隔不久的日期,时间?
配置DCOM将EXCEL的所以权限都放开,一切OK!
但就是在创建EXCEL进程的时候有点慢,这点始终是个问题
最后总结:机子好的导出EXCEL速度越快
首先要引用microsoft.excel11.0 object library,然后要用下面的语名才能找个所要的方法
using Excel = Microsoft.Office.Interop.Excel;
在MSDN里这方面的帮助太少了,现在我还不知
Excel.Range 的EntireColumn.AutoFit();什么意思呢?
高版就可以操作。
我现在都是操作XML的,不过必须要XP或以上版本。
好处就是不用担心COM释放问题,效率高,不过XML文件比SLX文件大很多。
/// 向EXCEL表格里插入数据库记录
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnExcel_Click(object sender, System.EventArgs e)
{
//查询数据库内容判断 AccFlage的值,如果其值是1则用'√'替换,如果是0则为空
string query_sql = "select AccDate,No,Abr_AccId,Abr_Content,Abr_Person,(select case when AccFlag = 1 then '√' when AccFlag = 0 then ''else ''end as 'AccFlag'),DbtAmt,CrdAmt,EndAmt from accounttype where accno = '" + cboNo.SelectedValue + "'and AccDate between '" + dateStart.Value.Date + "' and '" + dateEnd.Value.Date + "'";
SqlConnection con = new SqlConnection(ConStr);
SqlDataAdapter da = new SqlDataAdapter(query_sql,con);
DataSet ds = new DataSet();
da.Fill(ds,"accounttype"); string query = "select endamt from accounttype where id = '" + this.txtDate.Text + "'";
SqlDataAdapter daNow = new SqlDataAdapter(query,con);
DataSet dsNow = new DataSet();
daNow.Fill(dsNow,"accounttype");
txtNow.DataBindings.Clear();
txtNow.DataBindings.Add("Text",dsNow,"AccountType.EndAmt"); string str;
if(this.radioMoney.Checked)
{
str = "0";
}
else
{
str = "1";
} if(str == "0")
{
string query_money = "select * from money where MoneyAttr = 2";
SqlDataAdapter damoney = new SqlDataAdapter(query_money,con);
DataSet dsmoney = new DataSet();
damoney.Fill(dsmoney,"money");
txtMoney.DataBindings.Clear();
txtMoney.DataBindings.Add("Text",dsmoney,"Money.Money");
}
else
{
string query_money = "select * from money where MoneyAttr = 3";
SqlDataAdapter damoney = new SqlDataAdapter(query_money,con);
DataSet dsmoney = new DataSet();
damoney.Fill(dsmoney,"money");
txtMoney.DataBindings.Clear();
txtMoney.DataBindings.Add("Text",dsmoney,"Money.Money");
}
string filename="";
//将模板文件复制到一个新文件中
SaveFileDialog mySave = new SaveFileDialog();
mySave.Filter="Excel文件(*.XLS)|*.xls|所有文件(*.*)|*.*";
if(mySave.ShowDialog()!=DialogResult.OK)
{
return;
}
else
{
filename = mySave.FileName;
//将模板文件copy到新位置,建议实际开发时用相对路径,如Application.StartupPath.Trim()+"\\report\\normal.xls"
FileInfo mode=new FileInfo(Application.StartupPath.Trim() + @"\Report\CashReport.xls");
try
{
mode.CopyTo(filename,true);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
}
//打开复制后的文件
object missing = Missing.Value;
Excel.Application myExcel = new Excel.Application ( );
//打开新文件
myExcel.Application.Workbooks.Open(filename,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing);
//将Excel显示出来
myExcel.Visible=true;
//将列标题和实际内容选中
Excel.Workbook myBook = myExcel.Workbooks[1];
Excel.Worksheet mySheet = (Excel.Worksheet)myBook.Worksheets[1];
mySheet.Cells[2,5] = this.dateStart.Value.Date;
mySheet.Cells[2,8] = this.dateEnd.Value.Date;
mySheet.Cells[1,1] = "安徽省建行现金出纳统计表------" + this.cboNo.SelectedValue;
//判断是否有余额,如果没有就把初期额添加入EXCEL中
if(this.txtDate.Text == "")
{
mySheet.Cells[5,9] = txtMoney.Text.ToString();
}
else
{
mySheet.Cells[5,9] = txtNow.Text.ToString(); }
//向EXCEL里插记录
int HeadLines=5;
int j=0; for(int r = 0;r<ds.Tables[0].Rows.Count;r++)
{
if (((r+1) % 22)==0)
{
for(int i = 0;i<ds.Tables[0].Columns.Count;i++)
{
mySheet.Cells[j*2+r+HeadLines+1,i+1] = ds.Tables[0].Rows[r][i];
}
mySheet.Cells[j*2+r+HeadLines+2,4] = "过次页";
mySheet.Cells[j*2+r+HeadLines+3,4] = "呈上页";
mySheet.Cells[j*2+r+HeadLines+3,9] = ds.Tables[0].Rows[r][8];;
j++;
}
else
{
for(int i = 0;i<ds.Tables[0].Columns.Count;i++)
{
mySheet.Cells[j*2+r+HeadLines+1,i+1] = ds.Tables[0].Rows[r][i];
}
}
}
}
数据导入EXCEL没问题,你看看吧
用两个方法,一个方法foun1执行你的操作,并关闭,另外一个方法foun2:
provate void foun2()
{
foun1();
GC.Collect();//强行销毁}
Microsoft.Office.Interop.Excel.Worksheet mySheet=new Microsoft.Office.Interop.Excel.WorksheetClass();
myExcel.Visible=true;
myExcel.Workbooks.Add(true);//这样写才对不能释放是应为你没有把引用都断开
System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheets);
System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
...
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
System.Runtime.InteropServices.Marshal.ReleaseComObject(range);
worksheets=null;
worksheet=null;
...
excelApp=null;
range=null;把操作Excel文件用到的对象实例全部释放。然后资源回收!
GC.Collect();//这样就能都释放了