C#与excel操作项目之中时常涉及,其中为常用的内容是表格创建及与数据库的交互,于是查阅相关资料。
1 Excel对象
微软的Excel对象模型包括了128个不同的对象,从矩形,文本框等简单的对象到透视表,图表等复杂的对象.下面我们简单介绍一下其中最重要,也是用得最多的四个对象。
(1) Application对象。Application对象处于Excel对象层次结构的顶层,表示Excel自身的运行环境。
(2) Workbook对象。Workbook对象直接地处于Application对象的下层,表示一个Excel工作薄文件。
(3) Worksheet对象。Worksheet对象包含于Workbook对象,表示一个Excel工作表。
(4) Range对象。Range对象包含于Worksheet对象,表示Excel工作表中的一个或多个单元格。
2.1 Visual C#中调用Excel的COM组件
using Excel = Microsoft.Office.Interop.Excel;
.NET组件中定义了一个命名空间Excel,在此命名空间中封装了一个类Application,这个类和启动Excel表格有非常重要的关 系,在Visual C#中,只需要下列三行代码就可以完成打开Excel表格的工作,具体如下:
Excel.Application excel = new Excel.Application ();//引用Excel对象
excel.Application.Workbooks.Add ( true );//引用Excel工作簿
excel.Visible = true ;//使Excel可视
但此时的Excel表格是一个空的表格,没有任何内容,下面就来介绍如何往Excel表格中输入数据。
往Excel表格中输入数据
在命名空间"Excel"中,还定义了一个类"Cell",这个类所代表的就是Excel表格中的一个单元格。通过给"Cell"赋值,从而实现往Excel表格中输入相应的数据,下列代码功能是打开Excel表格,并且往表格输入一些数据。
Excel.Application excel = new Excel.Application () ;
excel.Application.Workbooks.Add ( true ) ;
excel.Cells[ 1 , 1 ] = "First Row First Column" ;
excel.Cells[ 1 , 2 ] = "First Row Second Column" ;
excel.Cells[ 2 , 1 ] = "Second Row First Column" ;
excel.Cells[ 2 , 2 ] = "Second Row Second Column" ;
excel.Visible = true ;
3.4 实例
下面实例在C#中连接Oracle数据库(Name),从表(TableName)中读取数据,并写入Excel.
string cnString="Provider=msdaora.1;Data source=Name; ";
cnString=cnString+"user id=UserName;password=Password";
try
{
OleDbConnection cn=new OleDbConnection (cnString);
cn.Open ();
try
{
string s="select * from Name.TableName";
OleDbCommand cmd=new OleDbCommand (s,cn);
OleDbDataReader dr=cmd.ExecuteReader ();
Excel.Application xlApp = new Excel.Application();
if(xlApp==null){MessageBox.Show ("Can’t open Excel!");return;}
xlApp.Application .Workbooks .Add (true);
int row=2,fieldcount;
fieldcount=dr.FieldCount ;
for(int col=0;col
我们先创建一个Application对象,并将对象的Visible属性设置为True:
Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application();
app.Visible = true;
1.1 以默认方式进行新建
调用app中Workbooks的Add()接口,可以实现按照默认方式新建一个Excel文档。Workbooks是文档Workbook文档类的集合,而Add()函数在参数为空的情况下可以按照默认参数新建一个Workbook对象并添加到Workbooks中。
app.Workbooks.Add();
除了上述按照默认方式创建空文档之外,我们还可以给Add()函数传入word模板的方式创建一个新的文档,而这个文档其实就是我们提供的word模板的一个副本。
app.Workbooks.Add("D:\\Test.xlsx");
注意:这种方式只是在内存中创建了一个原模板的副本,对改副本所做的修改不会更新到原来的模板上。
利用app. Workbooks的Open()函数可以打开一个已经存在的文档,此时是在该文档上进行修改,因此任何的改动都会生效。该函数会返回一个Workbook对象,它就是我们操作的Excel文档对象,后续基本一些其他操作都与它有关。
Workbook book=app.Workbooks.Open("D:\\Test.xlsx ");
调用Workbook的Add()的接口可以为文档增加一个,如图所示,默认情况下打开的Excel文件有3个Sheet,我们用Workbook的Add()的接口增加了一个Sheet
book.Worksheets.Add();
Workbook的Save()接口,可以将修改保存到已打开的文档。
book.Save();
app.Quit();
using Excel = Microsoft.Office.Interop.Excel;
using System.Reflection;
public class MyConsole
{
public static void Main()
{
Excel.Application app = new Excel.Application();
try
{
//让后台执行设置为不可见
app.Visible = false;
//新增加一个工作簿
Workbook wBook = app.Workbooks.Add(true);
//如果要打开已有的工作簿,则使用下面的注释语句
// Workbook wBook = app.Workbooks.Open(@"C:YourPathYourWorkbook.xls",
// missing, missing, missing, missing, missing, missing, missing,
// missing, missing, missing, missing, missing,missing, missing);
//取得一个工作表
//如果打开了已有的工作簿,也可以这样获取工作表Worksheet wSheet = wBook.ActiveSheet as Worksheet
Worksheet wSheet = wBook.Worksheets[1] as Worksheet;
wSheet.Cells[1, 1] = "this is a test";
//设置禁止弹出保存和覆盖的询问提示框
app.DisplayAlerts = false;
app.AlertBeforeOverwriting = false;
//保存工作簿
wBook.Save();
//保存excel文件
app.Save("C:abc.xls");
}
catch
{
}
finally
{
//确保Excel进程关闭
app.Quit();
app = null;
}
}
}
语句一 Workbook wBook = app.Workbooks.Add(true);Workbooks.Add的参数是个object类型,通常使用true或null,表明工作簿在默认文档下创建,或者使用枚举值 XlWBATemplate.xlWBATWorksheet,但如果传入一个excel完整文件名,按照自定义模板进行新建(这种自定义模板新建方式只是在内存中创建了一个原模板的副本,对改副本所做的修改不会更新到原来的模板上。)。
语句二 Worksheet wSheet = wBook.Worksheets[1] as Worksheet;wBook.Worksheets虽然反映的是工作表的集合,然而新创建的工作簿中只有一个工作表,且索引是1,如果换成0将无法找到指定的WorkSheet,如果是操作多个工作表的话,建议用new WorkSheetClass()实例化之后加入到wBook.Worksheets中去。如果是打开已存在的工作簿,这条语句也可能会报错,最好是调用wBook.ActiveSheet来获取或者再加些判断。
语句三 wBook.Save();app.Save("C:abc.xls")
生成的abc.xls除了本机上运行此代码的用户打开正常外,其他户打开后的错误信息如下:
无法访问文件。请尝试下列方法之一:
确认所指定的文件夹已存在。
确认文件所在的文件夹不是只读的。
确认给出的文件名不包含下列字符:<>?[]:Sheet1.xls或*。
确认文件/路径名长度不超过218个字符。
因为此时创建的工作簿其实是在当前用户的“我的文档”目录下自动生成了一个Sheet1.xls副本,而abc.xls是指向这个副本的快捷方式,所以导致其他用户无权访问。我采取的解决办法是将这两句替换为:
wSheet.SaveAs("C:abc.xls",Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value);
wBook.Save();
语句四 app.Quit();
凭借Quit()还没有释放掉对象,excel进程不一定会终止,于是,有人使用KillProcess()来处理,我个人认为这不是一个好主意,可能会破坏其它正在执行的excel进程。目前我使用app = null;权作安慰吧。退出前确保一定是执行过WorkBook或是Application的Save()方法的。
C#创建保存Excel文件
private void btn_Create(object sender,EventAgrs e)
{
string P_str_path=txt_Path.text;
Microsoft.Office.Interop,Excel.Application excel=new Morosoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop,Excel.Workboook new Workboook=excel.Application.Workboooks add(true);
object missing =System.Reflection.Missing.Value();
new WorkBook.WorkSheets.add(missing,missing,missing,missing);
if(P_str_path.EndsWith("\\"))
new WorkBook.SaveCopyAs(P_str_path+Datetime.Now.ToString("yyyyMMddhhmmss")+."xls");
else
new WorkBook.SaveCopyAs(P_str_path+"\\"+Datetime.Now.ToString("yyyyMMddhhmmss")+."xls");
MessageBox.Show("Excel文件创建成功","提示",MessangeButton.OK,MessageBoxIcon.Information);
System.Diagnostics.Process[]execelProcess=System.Diagnostics.Process.GetProcessByName("EXCEL");
foreach(System.Diagnostics.Process p in excelPricess)
p.Kill();
}
将SQLServer 数据查询结果输出到Excel
private void btn_Excel(object sender,EventAgrs e)
{
if(dgv_Info.Rows.Count==0)
return;
Microsoft.Office.Interop,Excel.Application excel=new Morosoft.Office.Interop.Excel.Application();
excel.Application.Workbooks.Add(true);
excel.Visible=true;
for(int i = 0; i
从 Excel 中获取数去到指定文件
private void btn_Output(object sender,EventAgrs e)
{
OleDbConnection olecon = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + txt_Path.Text + ";ExtendedProperties=Excel.8.0");
olecon.open
OleDbDataAdapter oledba = new OleDbDataAdapter("select*from["+cbox_SheetName.Text+"$]",olecon);
DataSet myds = new DataSet();
oleddba.Fill(myds);
Stream Writer SWiter = new Stream Writer(cbox_SheetName.Text+".txt",false,Encoding.Deflaut);
string P_str_Content="";
for(int i =0; i
C#创建Excel文件的操作的具体过程是什么呢?那么这里向你介绍了具体的实现实例,是用什么方法可以实现呢
1. private void Button2_Click(object sender, System.EventArgs e)
2. {
3. object missing = System.Reflection.Missing.Value;
4. //Excel.Application myExcel = new Excel.Application() ;
5. myExcel = new Excel.ApplicationClass();
6.
7. Excel._Workbook xBk ;//工作薄
8. Excel._Worksheet xSt;//工作Sheet
9.
10. xBk = myExcel.Workbooks.Add(true);
11.
12. for (inti = 0; i < 5; i ++)
13. {
14.xSt = (Excel._Worksheet)xBk.ActiveSheet;
15.xSt.Name ="chenms_" + i ;
16.myExcel.Cells[2,2]="chenms";
17.if(i < 4)
18.{
19. myExcel.Sheets.Add(missing,missing,1,Excel.XlSheetType.xlWorksheet);
20.}
21. }//C#创建Excel文件
22. myExcel.Visible = true;
23. xBk.SaveAs(@"d:cms.xls",missing,missing,
24.missing,missing,missing,Excel.XlSaveAsAccessMode.xlShared,
25.missing,missing,missing,missing,missing);
26. // myExcel.Save(@"d:cms.xls");C#创建Excel文件
27. myExcel.Quit();
28. Response.ClearContent();
29. Response.ClearHeaders();
30. Response.AppendHeader("Content-Disposition","attachment;filename=d:cms.xls");
31. Response.Buffer = true;
32. Response.ContentType = "application/ms-excel";
33. //将报表文件存入本地
34. Response.WriteFile("d:cms.xls");
35. Response.Flush();
36. Response.Close();
37. //C#创建Excel文件之从磁盘删除导出的文件
38. System.IO.File.Delete("d:cms.xls");
39.
40.}
C#中创建、打开、读取、写入、保存Excel的一般性代码
首先,在引用的COM中找到Microsoft.Office.Interop.Excel.dll,添加。
using System;
using System.Reflection; // 引用这个才能使用Missing字段
using Excel = Microsoft.Office.Interop.Excel;
namespace CExcel1
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
//创建Application对象
Excel.Application xApp=new Excel.Application();
xApp.Visible=true;
//得到WorkBook对象, 可以用两种方式之一: 下面的是打开已有的文件
Excel.Workbook xBook=xApp.Workbooks._Open(@"D:\Sample.xls",
Missing.Value,Missing.Value,Missing.Value,Missing.Value
,Missing.Value,Missing.Value,Missing.Value,Missing.Value
,Missing.Value,Missing.Value,Missing.Value,Missing.Value);
//xBook=xApp.Workbooks.Add(Missing.Value);//新建文件的代码
//指定要操作的Sheet,两种方式:
Excel.Worksheet xSheet=(Excel.Worksheet)xBook.Sheets[1];
//Excel.Worksheet xSheet=(Excel.Worksheet)xApp.ActiveSheet;
//读取数据,通过Range对象
Excel.Range rng1=xSheet.get_Range("A1",Type.Missing);
Console.WriteLine(rng1.Value2);
//读取,通过Range对象,但使用不同的接口得到Range
Excel.Range rng2=(Excel.Range)xSheet.Cells[3,1];
Console.WriteLine(rng2.Value2);
//写入数据
Excel.Range rng3=xSheet.get_Range("C6",Missing.Value);
rng3.Value2="Hello";
rng3.Interior.ColorIndex=6; //设置Range的背景色
//保存方式一:保存WorkBook
xBook.SaveAs(@"D:\CData.xls",
Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,
Excel.XlSaveAsAccessMode.xlNoChange,Missing.Value,Missing.Value,Missing.Value,
Missing.Value,Missing.Value);
//保存方式二:保存WorkSheet
xSheet.SaveAs(@"D:\CData2.xls",
Missing.Value,Missing.Value,Missing.Value,Missing.Value,
Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value);
//保存方式三
xBook.Save();
xSheet=null;
xBook=null;
xApp.Quit(); //这一句是非常重要的,否则Excel对象不能从内存中退出
xApp=null;
}
}
}
采用Microsoft Office自带的COM组件来进行开发,因为感觉这个用起来比较简单。
首先当然是引用usingMicrosoft.Office.Interop.Excel;这个组件里面有四个关键的对象,由大到小分便是Application,Workbook,Worksheet和Range。对于Excel的操作基本上是引用这些对象的方法和属性,而且操作起来简单易懂,下面分别介绍一下每一个对象的一些功能和基本用法,涉及得可能不够全面。
Application对象代表 Excel 应用程序本身。主要的属性都是控制一些全局的属性,比如状态(cursor,EditDirectlyInCell),显示(DisplayAlerts,DisplayFullScreen)和Excel里面一些元素(Workbooks,Sheets)的控制等。其中最关键的就是和Workbooks属性的交互,使我们可以打开,新建工作簿并进行一步的操作。
参考 一般贴:https://blog.csdn.net/zou15093087438/article/details/79369798
参考 一般帖:https://blog.csdn.net/lp244392323/article/details/7075587