excel数据导入SqlServer中

编写程序,把附件的EXCEL文件( (实验题附件1)03级学生名单.xls
或(实验题附件2)成绩登记表.xls) 导入到SQL SERVER2000数据库中.
要求:
1、EXCEL文件作为数据源
2、根据EXCEL文件的字段在SQL SERVER中建立对应的字段
3、把EXECL中的记录导到SQL SERVER中


string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = c:\\test.xls;Extended Properties=Excel 8.0" ;
OleDbConnection myConn = new OleDbConnection (strCon) ;
myConn.Open() ;
string strCom = " Select Category,Comp_Num FROM [Sheet1$] " ;
OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom,myConn);
dataSet1 = new DataSet();
myCommand.Fill (dataSet1 , "[Sheet1$]");
myConn.Close();


=================================================================================================================

1.建立与excel表的连接,获得工作表ObjWorkSheet,
using Microsoft.Office.Interop.Excel;
Microsoft.Office.Interop.Excel.Application ObjExcel = new Microsoft.Office.Interop.Excel.Application();
Workbook ObjWorkBook;
Worksheet ObjWorkSheet = null;
ObjWorkBook = ObjExcel.Workbooks.Open(sPathName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
foreach (Microsoft.Office.Interop.Excel.Worksheet sheet in ObjWorkBook.Sheets){if (https://www.360docs.net/doc/643363808.html,.ToLower() == sheetName.ToLower()){ObjWorkSheet = sheet;break;}}if (ObjWorkSheet == null)
throw new Exception(string.Format("{0} not found!!", sheetName));
2.得到单元格中的内容,注意i从1开始,j从1开始计,i==1时,对应字段名称所在的行
Range cell = (Range)ObjWorkSheet.Cells[i, j];
单元格的值为cell.value2
3.设置字段类型需要做一个交互界面,你先获得并显示字段名称,然后对其设置类型
4.由交互界面获得字段和字段类型,利用你的编程接口将excel的数据导入数据库
我的是用oracle数据库的,与你的接口不同,所以只能说这么多了.

=================================================================================================================

C#操作Excel文件(读取Excel,写入Excel)
现在共享大家,希望给大家能够给大家带了一定的帮助。
另外我们还要注意一些简单的问题1.excel文件只能存储65535行数据,如果你的数据大于65535行,那么就需要将excel分割存放了。2.关于乱码,这主要是字符设置问题。
1.加载Excel(读取excel内容)返回值是一个DataSet
//加载Excel
public static DataSet LoadDataFromExcel(string filePath)
{
try
{
string strConn;
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties='Excel 8.0;HDR=False;IMEX=1'";
OleDbConnection OleConn = new OleDbConnection(strConn);

OleConn.Open();
String sql = "SELECT * FROM [Sheet1$]";//可是更改Sheet名称,比如sheet2,等等
OleDbDataAdapter OleDaExcel = new OleDbDataAdapter(sql, OleConn);
DataSet OleDsExcle = new DataSet();
OleDaExcel.Fill(OleDsExcle, "Sheet1");
OleConn.Close();
return OleDsExcle;
}
catch (Exception err)
{
MessageBox.Show("数据绑定Excel失败!失败原因:" + err.Message, "提示信息",
MessageBoxButtons.OK, https://www.360docs.net/doc/643363808.html,rmation);
return null;
}
}
2.写入Excel内容,参数:excelTable是要导入excel的一个table表
public static bool SaveDataTableToExcel(System.Data.DataTable excelTable, string filePath)
{
Microsoft.Office.Interop.Excel.Application app =
new Microsoft.Office.Interop.Excel.ApplicationClass();
try
{
app.Visible = false;
Workbook wBook = app.Workbooks.Add(true);
Worksheet wSheet = wBook.Worksheets[1] as Worksheet;
if (excelTable.Rows.Count > 0)
{
int row = 0;
row = excelTable.Rows.Count;
int col = excelTable.Columns.Count;
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
string str = excelTable.Rows[i][j].ToString();
wSheet.Cells[i + 2, j + 1] = str;
}
}
}
int size = excelTable.Columns.Count;
for (int i = 0; i < size; i++)
{
wSheet.Cells[1, 1 + i] = excelTable.Columns[i].ColumnName;
}
//设置禁止弹出保存和覆盖的询问提示框
app.DisplayAlerts = false;
app.AlertBeforeOverwriting = false;
//保存工作簿
wBook.Save();
//保存excel文件
app.Save(filePath);
app.SaveWorkspace(filePath);
app.Quit();
app = null;
return true;
}
catch (Exception err)
{
MessageBox.Show("导出Excel出错!错误原因:" + err.Message, "提示信息",
MessageBoxButtons.OK, https://www.360docs.net/doc/643363808.html,rmation);
return false;
}
finally
{
}
}
转载!半支烟阿杰
https://www.360docs.net/doc/643363808.html,/gisfarmer/
AddNew:注意
语句一 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");这两句代码至关重要,而且必不可少,否则,保存时会弹出“是否保存sheet1.xls”的对话框。像示例中的保存,在windows server 2003中,因为权限的原因,还可能会出现这样的现象(其它操作系统的结果有待考证):生成的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();
这样做,“我的文档”下就不会再创建Sheet1.xls,而且打开可以发现,原来工作簿里那个工作表名是sheet1.xls的也更改名字为abc.xls了。
语句四 app.Quit();
这个关闭一直有疑点,因为C#操作com非托管对象时,凭借Quit()还没有释放掉对象,excel进程不一定会终止,于是,有人使用KillProcess()来处理,我个人认为这不是一个好主意,可能会破坏其它正在执行的excel进程。目前我使用app = null;权作安慰吧。不过有一点是一定要做到,就是在Quit()前不能再有任何更改,不然还是会弹出保存的对话框。所以退出前确保一定是执行过WorkBook或是Application的Save()方法的。




===================================================================================================================
using Microsoft.Office.Interop.Excel;
using System.Reflection;

public class MyConsole
{
public static void Main()
{
Application app = new ApplicationClass();
try
{
//让后台执行设置为不可见
app.Visible

= false;
//新增加一个工作簿
Workbook wBook = app.Workbooks.Add(true);
//如果要打开已有的工作簿,则使用下面的注释语句
// Workbook wBook = app.Workbooks.Open(@"C:/YourPath/YourWorkbook.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");这两句代码至关重要,而且必不可少,否则,保存时会弹出“是否保存sheet1.xls”的对话框。像示例中的保存,在windows server 2003中,因为权限的原因,还可能会出现这样的现象(其它操作系统的结果有待考证):生成的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();
这样做,“我的文档”下就不会再创建Sheet1.xls,而且打开可以发现,原来工作簿里那个工作表名是sheet1.xls的也更改名字为abc.xls了。

语句四 app.Quit();
这个关闭一直有疑点,因为C#操作com非托管对象时,凭借Quit()还没有释放掉对象,excel进程不一定会终止,于是,有人使用KillProcess()来处理,我个人认为这不是一个好主意,可能会破坏其它正在执行的excel进程。目前我使用app = null;权作安慰吧。不过有一点是一定要做到,就是在Quit()前不能再有任何更改,不然还是会弹出保存的对话框。所以退出前确保一定是执行过WorkBook或是Application的Save()方法的。

=================================================================================================================

VS2005[C#] 操作 Excel 全攻略
using System;
using System.Collections.Generic;
using https://www.360docs.net/doc/643363808.html,ponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.Office.Interop.Excel;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.Reflection;
namespace ExcelPrj
{
///


/// Excel 系统中的主文件Excel.exe 本身就是 COM 组件,通过在.NET 项目中引用Exel.exe 文件可以实现对Excel 的功能控制
/// 与COM 组件相互操作是通过使用"包装类"(Wrapper Class) 和"代理"(Proxy) 的机制实现的.包装类使.NET 程序可以识别COM 组件提供的接口,而代理类则是提供对 COM 接口的访问
///

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button3_Click(object sender, EventArgs e)
{
ExportTasks(Bind(), dataGridView1);
}
//如果 Excel 安装在计算机上,侧导出表格内容到 Excel
public void ExportTasks(DataSet TasksData, DataGridView TasksGridView)
{
// 定义要使用的Excel 组件接口
// 定义Application 对象,此对象表示整个Excel 程序
Microsoft.Office.Interop.Excel.Application excelApp = null ;
// 定义Workbook对象,此对象代表工作薄
Microsoft.Office.Interop.Excel.Workbook workBook;
// 定义Worksheet 对象,此对象表示Execel 中的一张工作表
Microsoft.Office.Interop.Excel.Worksheet ws=null;
//定义Range对象,此对象代表单元格区域
Microsoft.Office.Interop.Excel.Range r;
int row = 1; int cell = 1;
try
{
//初始化 Application 对象 excelApp
excelApp = new Microsoft.Office.Interop.Excel.Application();
//在工作薄的第一个工作表上创建任务列表
workBook = excelApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
ws =(Worksheet)workBook.Worksheets[1];
// 命名工作表的名称为 "Task Management"
https://www.360docs.net/doc/643363808.html, = "Task Management";
#region 创建表格的列头

// 遍历数据表中的所有列
foreach (DataGridViewColumn cs in TasksGridView.Columns)
{
// 假如并不想把主键也显示出来
if (cs.HeaderText != "编号")
{
ws.Cells[row, cell] = cs.HeaderText;
r = (Range)ws.Cells[row, cell];
ws.get_Range(r, r).HorizontalAlignment = Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignCenter;

//此处用来设置列的样式
cell++;
}
}

// 创建行,把数据视图记录输出到对应的Excel 单元格
for (int i = 2; i < TasksData.Tables[0].Rows.Count; i++)
{
for (int j = 1; j < TasksData.Tables[0].Columns.Count; j++)
{

ws.Cells[i, j] = TasksData.Tables[0].Rows[j].ToString();
// r = (Range)ws.Cells[i,j];
Range rg = (Range)ws.get_Range(ws.Cells[i, j], ws.Cells[i, j]);
rg.EntireColumn.ColumnWidth = 20;
// rg.Columns.AutoFit();
rg.NumberFormatLocal = "@";
}
}
#endregion
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}

//显示 Excel
excelApp.Visible = true;

}
private void button5_Click(object sender, EventArgs e)
{
DataSet ds = Bind();
dataGridView1.DataSource = ds.Tables[0];
}
private DataSet Bind()
{
SqlConnection conn = new SqlConnection("Server=.;Database=testManage;Integrated Security=SSPI");
SqlDataAdapter da = new SqlDataAdapter("select FNumber,FExamNum,FName,FSex,FJobAdd,FCardID,FBirDate from stuInfo", conn);
DataSet ds = new DataSet();
da.Fill(ds);
return ds;
}
private void button2_Click(object sender, EventArgs e)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Title = "请选择将导出的EXCEL文件存放路径";
sfd.FileName = System.DateTime.Now.ToShortDateString() + "-学生信息";
sfd.Filter = "Excel文档(*.xls)|*.xls";
sfd.ShowDialog();

if (sfd.FileName != "")
{

Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
if (excelApp == null)
{
MessageBox.Show("无法创建Excel对象,可能您的机器未安装Excel");
}
else
{
Microsoft.Office.Interop.Excel.Workbooks workbooks = excelApp.Workbooks;
Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);
Microsoft.Office.Interop.Excel.Worksheet worksheet =(Worksheet) workbook.Worksheets[1];
DataSet ds=Bind();
for (int i = 1; i < ds.Tables[0].Rows.Count; i++)
{
for (int j = 1; j < ds.Tables[0].Columns.Count;j++ )
{
if (i == 1)
{
worksheet.Cells[i, j] = dataGridView1.Columns[j].HeaderText;

}
worksheet.Cells[i+1, j] = ds.Tables[0].Rows[j].ToString();
}
}
//保存方式一:保存WorkBook
//workbook.SaveAs(@"F:\CData.xls",
// Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,
// Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,Missing.Value,Missing.Value,Missing.Value,
// Missing.Value,Missing.Value);
//保存方式二:保存WorkSheet
// worksheet.SaveAs(@"F:\CData2.xls",
// Missing.Value, Missing.Value, Missing.Value, Missing.Value,
// Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Valu

e);
////保存方式三
//workbook.Saved = true;
//workbook.SaveCopyAs(sfd.FileName);

System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
worksheet = null;
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
workbook = null;
workbooks.Close();
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks);
workbooks = null;
excelApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
excelApp = null;
MessageBox.Show("导出Excel完成!");
}
}

}
private void button4_Click(object sender, EventArgs e)
{
string strExcelFileName = @"F:\\2007-07-16-学生信息.xls";
string strSheetName = "sheet1";
#region Aspnet 操作Excel 正确
////源的定义
//string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " + strExcelFileName + ";Extended Properties ='Excel 8.0;HDR=NO;IMEX=1'";
////Sql语句
//string strExcel = "select * from [" + strSheetName + "$]";
////定义存放的数据表
//DataSet ds = new DataSet();
////连接数据源
//OleDbConnection conn = new OleDbConnection(strConn);
//conn.Open();
////适配到数据源
//OleDbDataAdapter adapter = new OleDbDataAdapter(strExcel, conn);
//adapter.Fill(ds,"res");
//conn.Close();
//// 一般的情况下. Excel 表格的第一行是列名
//dataGridView2.DataSource = ds.Tables["res"];
#endregion
#region COM 组件读取复杂Excel
Microsoft.Office.Interop.Excel.Application excelApp = null;
Microsoft.Office.Interop.Excel.Workbook workBook;
Microsoft.Office.Interop.Excel.Worksheet ws = null;
try
{
excelApp = new Microsoft.Office.Interop.Excel.Application();
workBook = excelApp.Workbooks.Open(@"F:\\Book1.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, Missing.Value, Missing.Value);
ws = (Worksheet)workBook.Worksheets[1];

//Excel 默认为 256 列..
MessageBox.Show(ws.Cells.Columns.Count.ToString());
excelApp.Quit();
}
catch (Exception ex)
{
throw ex;
}
#endregion
}
}
}

=================================================================================================================

VS C# 2008读取Excel 2007里的数据
private OleDbConnection conn = null;
//建立与Excel的连接
private void getConnection()
{
string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + https://www.360docs.net/doc/643363808.html,bel8.Text.Trim() + ";Extended Properties=\"Excel 12.0;HDR=YES\"";
if (conn == null)
conn = new OleDbConnection(connectionString);
}
//
private OleDbDataReader dataReader(string sql)
{
this.getConnection();
OleDbDataReader dataReader = null;
OleDbCommand cmd = new OleDbCommand(sql, conn);
try
{
conn.Open();
dataReader = cmd.ExecuteReader();


}
catch (Exception ex) { }
return dataReader;
}
//填充发件箱
private void fillOutBox()
{
string sql = "SELECT * FROM [OutBox$]";
OleDbDataReader dataReader = this.dataReader(sql);
DataTable dt = new DataTable();
dt.Columns.AddRange(
new DataColumn[]{
new DataColumn("mobile",typeof(string)),
new DataColumn("message",typeof(string)),
new DataColumn("time",typeof(string))
});
int i = 0;
while (dataReader.Read())
{
i++;
if (i == 1)
continue;
DataRow dr = dt.NewRow();
dr["mobile"] = Convert.ToString(dataReader.GetValue(1));
dr["message"] = Convert.ToString(dataReader.GetValue(2));
dr["time"] = Convert.ToString(dataReader.GetValue(3));

dt.Rows.Add(dr);
}
this.close();
this.insertFillOutBox(dt);
}
private void insertFillOutBox(DataTable dt)
{
this.sHToutBoxBindingSource.DataMember = "SHToutBox";
this.sHToutBoxBindingSource.DataSource = dt;
this.sHToutBoxDataGridView.DataSource = this.sHToutBoxBindingSource;
//把导入的数据插入数据库
string str_sql = "";
string mobile = "";
string message = "";
string time = "";
int outBoxRowsCount = this.sHToutBoxDataGridView.Rows.Count;
for (int j = 0; j < outBoxRowsCount; j++)
{
mobile = this.sHToutBoxDataGridView.Rows[j].Cells[0].Value.ToString();
message = this.sHToutBoxDataGridView.Rows[j].Cells[1].Value.ToString();
time = this.sHToutBoxDataGridView.Rows[j].Cells[2].Value.ToString();
str_sql = "INSERT INTO SHToutBox(mobile, message, time)VALUES ('" + mobile + "','" + message + "','" + time + "')";
https://www.360docs.net/doc/643363808.html,mandText = str_sql;
this.tableAdapterManager.SHToutBoxTableAdapter.Adapter.InsertCommand.Connection.Open();
this.tableAdapterManager.SHToutBoxTableAdapter.Adapter.InsertCommand.ExecuteNonQuery();
this.tableAdapterManager.SHToutBoxTableAdapter.Adapter.InsertCommand.Connection.Close();
}
}
OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = "Excel文件(*.xlsx,*.xls)|*.xlsx;*xls";//设置打开文件的格式
dialog.InitialDirectory = path;//指定初始化路径
if (File.Exists(path + @"\phone.xlsx"))
{
dialog.FileName = "phone.xlsx";

}
DialogResult result = dialog.ShowDialog();
if (result == DialogResult.OK)
{
https://www.360docs.net/doc/643363808.html,bel8.Text = dialog.FileName;

if (https://www.360docs.net/doc/643363808.html,bel8.Text.Trim() != "")
{
try
{
this.fillOutBox();
this.statusBarPanel1.Text = "导入数据成功";
this.statusBarPanel2.Text = "";
}
catch (Exception exc) { }
}
else
{
this.statusBarPanel1.Text = "请选择导出的Excel文件";
}
}

==================================================================================================================

c#操作excel详解
首先创建 Excel 对象,使用ComObj:
var ExcelApp: Variant;
ExcelApp := CreateOleObject( 'Excel.Application' );

1) 显示当前窗口:
ExcelApp.Visible := True;

2) 更改 Excel 标题栏:
ExcelApp.Caption := '应用程序调用 Microsoft Excel';

3) 添加新工作簿:
ExcelApp.WorkBooks.Add;

4) 打开已存在的工作簿:
ExcelApp.WorkBooks.Open( 'C:\Excel\Demo.xls' );

5) 设置第2个工作表为活动工作表:
ExcelApp.WorkSheets[2].Activate;

ExcelApp.WorksSheets[ 'Sheet2' ].Activate;

MyExcelSheet3.Activate();
6) 给单元格赋值:
ExcelApp.Cells[1,4].Value := '第一行第四列';

7) 设置指定列的宽度(单位:字符个数),以第一列为例:
ExcelApp.ActiveSheet.Columns[1].ColumnsWidth := 5;

8) 设置指定行的高度(单位:磅)(1磅=0.035厘米),以第二行为例:
ExcelApp.ActiveSheet.Rows[2].RowHeight := 1/0.035; // 1厘米

9) 在第8行之前插入分页符:
ExcelApp.WorkSheets[1].Rows[8].PageBreak := 1;

10) 在第8列之前删除分页符:
ExcelApp.ActiveSheet.Columns[4].PageBreak := 0;

11) 指定边框线宽度:
ExcelApp.ActiveSheet.Range[ 'B3:D4' ].Borders[2].Weight := 3;
1-左 2-右 3-顶 4-底 5-斜( \ ) 6-斜( / )

12) 清除第一行第四列单元格公式:
ExcelApp.ActiveSheet.Cells[1,4].ClearContents;

13) 设置第一行字体属性:
ExcelApp.ActiveSheet.Rows[1]https://www.360docs.net/doc/643363808.html, := '隶书';
ExcelApp.ActiveSheet.Rows[1].Font.Color := clBlue;
ExcelApp.ActiveSheet.Rows[1].Font.Bold := True;
ExcelApp.ActiveSheet.Rows[1].Font.UnderLine := True;

14) 进行页面设置:

a.页眉:
ExcelApp.ActiveSheet.PageSetup.CenterHeader := '报表演示';
b.页脚:
ExcelApp.ActiveSheet.PageSetup.CenterFooter := '第&P页';
c.页眉到顶端

边距2cm:
ExcelApp.ActiveSheet.PageSetup.HeaderMargin := 2/0.035;
d.页脚到底端边距3cm:
ExcelApp.ActiveSheet.PageSetup.HeaderMargin := 3/0.035;
e.顶边距2cm:
ExcelApp.ActiveSheet.PageSetup.TopMargin := 2/0.035;
f.底边距2cm:
ExcelApp.ActiveSheet.PageSetup.BottomMargin := 2/0.035;
g.左边距2cm:
ExcelApp.ActiveSheet.PageSetup.LeftMargin := 2/0.035;
h.右边距2cm:
ExcelApp.ActiveSheet.PageSetup.RightMargin := 2/0.035;
i.页面水平居中:
ExcelApp.ActiveSheet.PageSetup.CenterHorizontally := 2/0.035;
j.页面垂直居中:
ExcelApp.ActiveSheet.PageSetup.CenterVertically := 2/0.035;
k.打印单元格网线:
ExcelApp.ActiveSheet.PageSetup.PrintGridLines := True;

15) 拷贝操作:

a.拷贝整个工作表:
https://www.360docs.net/doc/643363808.html,ed.Range.Copy;
b.拷贝指定区域:
ExcelApp.ActiveSheet.Range[ 'A1:E2' ].Copy;
c.从A1位置开始粘贴:
ExcelApp.ActiveSheet.Range.[ 'A1' ].PasteSpecial;
d.从文件尾部开始粘贴:
ExcelApp.ActiveSheet.Range.PasteSpecial;

16) 插入一行或一列:
a. ExcelApp.ActiveSheet.Rows[2].Insert;
b. ExcelApp.ActiveSheet.Columns[1].Insert;

17) 删除一行或一列:
a. ExcelApp.ActiveSheet.Rows[2].Delete;
b. ExcelApp.ActiveSheet.Columns[1].Delete;

18) 打印预览工作表:
ExcelApp.ActiveSheet.PrintPreview;

19) 打印输出工作表:
ExcelApp.ActiveSheet.PrintOut;

20) 工作表保存:
if not ExcelApp.ActiveWorkBook.Saved then
ExcelApp.ActiveSheet.PrintPreview;

21) 工作表另存为:
ExcelApp.SaveAs( 'C:\Excel\Demo1.xls' );

22) 放弃存盘:
ExcelApp.ActiveWorkBook.Saved := True;

23) 关闭工作簿:
ExcelApp.WorkBooks.Close;

24) 退出 Excel:
ExcelApp.Quit;

===================================================================================================================

C#与EXCEL的数据交互
https://www.360docs.net/doc/643363808.html,/newOperate/html/1/12/122/8662.html
首先说明,我不是程序员,也不是科班出身,只是因为工作中需要管理比较多的数据,而数据又需要留存备查,公司也没有符合要求的系统,于是萌发了开发一个数据管理系统的想法。根据自身的爱好,在不需公司投入资金的情况下,选择了VC# 2005 EXPRESS作为开发工具,SQL SERVER 2005 EXPRESS作为存储数据库。由于是在局域网环境下,使用人员也就是几个人,系统就做成了C/S的。平常工作最常用的是EXCEL来处理数据,包括数据的预处理和打印等,与其他部门的联系也是使用EXCEL,所以要求管理系统方便与EXCEL交互,最重要的就是DataTable(DataGridView)与EXCEL之间的导入导出,也因此

开始研究C#2005如何操作EXCEL。好,废话少说,下面先说说数据从DataTable导出到EXCEL中,有不成熟的地方,请各位大侠指点。
本文假设大家已经熟悉C#对Excel的调用,如果不熟悉,请参考MSDN中的《使用Excel对象模型实现Excel自动化》
一、DataTable To Excel
先定义一下:
private Excel.Application excelApp= new Excel.ApplicationClass();//Application与ApplicationClass的区别我没有明白。
private Excel.Workbook excelBook = excelApp.Workbooks.Add(Type.Missing);
private Excel.Worksheet excelSheet = (Excel.Worksheet)excelBook.ActiveSheet;
excelApp.Visible = true;
1、让我们看看在网上流传最多的解决方案:
public void DataTableToExcel(DataTable dt) { for (int i = 0; i < dt.Rows.Count; i++) { for (int j=0;j< dt.Columns.Count;j++) { excelSheet.Cells[i+1,j+1] = dt.Rows[i][j].ToString(); } } }
不可否认这段程序会不出错误的运行,但是效率就比较低了,会随着数据行和列的增加而增加,主要的时间都耗在了Excel单元格的读取上。
让我们改进一下,利用DataRow.ItemArray:
public void DataTableToExcel(DataTable dt)
{
int colCount = dt.Columns.Count;
for (int i = 0; i < dt.Rows.Count; i++)
{
excelSheet.get_Range(excelSheet.Cells[i+1,1], excelSheet.Cells[i+1, colCount]).Value2 = dt.Rows[i].ItemArray;
}
}
这就有了很大进步,效率与数据列的多少已经无关了,对于这个改进我在网上还没有看到,为此我还曾沾沾自喜,但是这个方法的效率依然不高,尤其是灵活性不够。
以上效率的损失主要是每导出一条记录都要与Excel交互一次,如果我们把数据准备好一次性写入Excel是否效率更快?看如下程序:
public void DataTableToExcel(DataTable dt)
{
int rowCount = dt.Rows.Count;
int colCount = dt.Columns.Count;
object[,] dataArray = new object[rowCount,colCount];
for (int i = 0; i < rowCount; i++)
{
for (int j=0;j< colCount;j++)
{
dataArray[i, j] = dt.Rows[i][j];
}
}
excelSheet.get_Range("A1", excelSheet.Cells[rowCount, colCount]).Value2 = dataArray;
}
由于二维数组是在内存中实现,所以速度很快,由于是一次性写入到Excel中,使我们几乎感觉不到延迟,在Excel打开后数据马上就出来了,感觉很爽。
这一篇先写这些,下一篇中主要讨论一下字段标题的设置技巧,行列的筛选与排序等的技巧。
另,在上述学习过程中,我曾想能否利用dt.Rows[i].ItemArray来组建二维数组,也就是多个相同结构的一维数组简单快速的合并成一个二维数组,当然不是利用for循环。由于我初学,还是个新手,我一直没有找到相关资料,不知哪位大侠指点一下。
二、给DataTableToExcel添加些智能
1、问题提出:数据导出时Dat

aTable包含了一些不需要的数据行,需要进行进一步的筛选;导出时不能只要数据,每个字段的标题还要包括。在导出到Excel表时,有时并不是从第一行第一列开始,可能还有个“XXX明细表”、序号列之类的附加行列。
我的解决方案:1)、利用DataTable.Select(string filterExpression)方法进行筛选;
2)、先设置好DataTable每列的Caption,然后导出Caption即可。
3)、添加起始行列的索引参数。
还是看代码:
2、问题提出:很多人对长数字串(如身份证号码)导出到Excel表时变成科学计数法或日期型字段变成了数字烦恼,网上一般给的解决方法是在数字串前加“’”,这是一种治标不治本的方法,不仅处理上麻烦不灵活,还不具有扩展通用性。
我的解决方案:根据DataTable中字段的数据类型(dt.Columns[i].DataType)设置EXCEL中相应区域的格式。
代码:
3、问题提出:DataTable中有些列不需要导出(如自增列),有些列的前后顺序根据要求可能也不相同,怎么办?
我的解决方案:加入一个int[]数组(如new int[]{5,2,6,4,3,8},数组中元素表示DataTable中第几列),根据数组中列的序号和位置进行筛选和排序。
让我们扩展上面的代码:
写道这儿,DataTableToExcel也算是基本满足要求了,一些个性化的功能可以根据自己的需要增加,比如,可以返回导入到Excel最后一行的行号,方便接着导入下一个表;由于Excel有行数限制或者某些要求一个sheet不能超过多少行,这时可以采用多个sheet分页的方式导入,这是更加深入的话题了。
以上功能的实现,都是因为工作中实际需要产生的,不是每个人都需要的,可以根据情况进行重构。
public void DataTableToExcel(DataTable dt,string sFilter,int startRow,int startCol,int[] columns)
{
DataRow[] drs = dt.Select(sFilter);//根据筛选条件筛选。
int rowCount = drs.Length;
int colCount = columns. Length;
object[,] dataArray = new object[rowCount+1,colCount];//二维数组定义是多一个标题行。
for (int j = 0; j < colCount; j++)
{
dataArray[0,j] = dt.Columns[columns[j]].Caption;//导出字段标题。
//根据各列的数据类型设置Excel的格式。
switch(dt.Columns[columns[j]].DataType.ToString())
{
case “System.String”: excelSheet.get_Range(excelSheet.Cells[startRow, startCol+j], excelSheet.Cells[rowCount+startRow, startCol+j]).NumberFormatLocal = “@”;break;
case “System.DateTime”: excelSheet.get_Range(excelSheet.Cells[startRow, startCol+j], excelSheet.Cells[rowCount+startRow, startCol+j]).NumberFormatLocal = “yyyy-mm-dd”;break;
//可以根据自己的需要扩展。
default: excelSheet.get_Range(excelShee

t.Cells[startRow, startCol+j], excelSheet.Cells[rowCount+startRow, startCol+j]).NumberFormatLocal = “G/通用格式”;break;
}
for (int i=0;i< rowCount;i++)
{
dataArray[i+1, j] = drs[i][columns[j]];
}
}
excelSheet.get_Range(excelSheet.Cells[startRow, startCol], excelSheet.Cells[rowCount+startRow, colCount+startCol-1]).Value2 = dataArray;
}
public void DataTableToExcel(DataTable dt,string sFilter,int startRow,int startCol)
{
DataRow[] drs = dt.Select(sFilter);//根据筛选条件筛选。
int rowCount = drs.Length;
int colCount = dt.Columns.Count;
object[,] dataArray = new object[rowCount+1,colCount];//二维数组定义是多一个标题行。
for (int j = 0; j < colCount; j++)
{
dataArray[0,j] = dt.Columns[j].Caption;//导出字段标题。

//根据各列的数据类型设置Excel的格式。
switch(dt.Columns[i].DataType.ToString())
{
case “System.String”: excelSheet.get_Range(excelSheet.Cells[startRow, startCol+j], excelSheet.Cells[rowCount+startRow, startCol+j]).NumberFormatLocal = “@”;break;
case “System.DateTime”: excelSheet.get_Range(excelSheet.Cells[startRow, startCol+j], excelSheet.Cells[rowCount+startRow, startCol+j]).NumberFormatLocal = “yyyy-mm-dd”;break;
//可以根据自己的需要扩展。
default: excelSheet.get_Range(excelSheet.Cells[startRow, startCol+j], excelSheet.Cells[rowCount+startRow, startCol+j]).NumberFormatLocal = “G/通用格式”;break;
}
for (int i=0;i< rowCount;i++)
{
dataArray[i+1, j] = drs[i][j]; }
}
excelSheet.get_Range(excelSheet.Cells[startRow, startCol], excelSheet.Cells[rowCount+startRow, colCount+startCol-1]).Value2 = dataArray;
}
public void DataTableToExcel(DataTable dt,string sFilter,int startRow,int startCol)

{
DataRow[] drs = dt.Select(sFilter);//根据筛选条件筛选。
int rowCount = drs.Length;
int colCount = dt.Columns.Count;
object[,] dataArray = new object[rowCount+1,colCount];//二维数组定义是多一个标题行。
for (int j = 0; j < colCount; j++)
{
dataArray[0,j] = dt.Columns[j].Caption;//导出字段标题。
for (int i=0;i< rowCount;i++)
{
dataArray[i+1, j] = drs[i][j];
}
}
excelSheet.get_Range(excelSheet.Cells[startRow, startCol], excelSheet.Cells[rowCount+startRow, colCount+startCol-1]).Value2 = dataArray;
}

===================================================================================================================

C#实现Excel文件比较(三)
Excel/Variables.cs文件:
using System;
using System.Collections.Generic;
using System.Xml;
namespace com.baidu.hi.js2007.Excel
{
internal class Variables
{
private string[,] vars;
internal Variables(st

ring[,] vars)
{
this.vars = vars;
}
internal void Load(XmlElement e)
{
if (e != null)
{
for (int i = 0; i < vars.GetUpperBound(0); i++)
{
if (e.Attributes[vars[i, 0]] != null)
{
vars[i, 1] = e.GetAttribute(vars[i, 0]);
}
}
}
}
public override bool Equals(object obj)
{
Variables var = obj as Variables;
if (var == null)
{
return false;
}
for (int i = 0; i < vars.GetUpperBound(0); i++)
{
if (vars[i, 1] != var.vars[i, 1])
{
return false;
}
}
return true;
}
}
}
Excel/Workbook.cs文件:
using System;
using System.Collections.Generic;
using System.Xml;
namespace com.baidu.hi.js2007.Excel
{
class Workbook
{
private IDictionary worksheets = new Dictionary();
private IDictionary styles = new Dictionary();
public IDictionary Worksheets
{
get { return worksheets; }
}
public IDictionary Styles
{
get { return styles; }
}
public void Load(XmlElement e)
{
XmlNamespaceManager nsmr = new XmlNamespaceManager(https://www.360docs.net/doc/643363808.html,Table);
nsmr.AddNamespace("ss", https://www.360docs.net/doc/643363808.html,spaceURI);
foreach (XmlElement node in e.SelectNodes("ss:Styles/ss:Style", nsmr))
{
Style style = new Style();
style.Load(node);
this.styles.Add(style.ID, style);
}
foreach (XmlElement node in e.SelectNodes("ss:Worksheet", nsmr))
{
Worksheet worksheet = new Worksheet(this);
worksheet.Load(node);
this.worksheets.Add(https://www.360docs.net/doc/643363808.html,, worksheet);
}
}
}
}
Excel/Worksheet.cs文件:
using System;
using System.Collections.Generic;
using System.Xml;
namespace com.baidu.hi.js2007.Excel
{
class Worksheet
{
private Workbook workbook;
private string name;
private IDictionary cells = new Dictionary();
public Workbook Workbook
{
get { return workbook; }
}
public string Name
{
get { return name; }
}
public Cell this[int row, int column]
{
get { if (cells.ContainsKey((row << 8) + column))
{
return cells[(row << 8) + column];
}
else return null;
}
set { cells.Ad

d((row << 8) + column, value); }
}
public Worksheet(Workbook workbook)
{
this.workbook = workbook;
}
internal void Load(XmlElement e)
{
XmlNamespaceManager nsmr = new XmlNamespaceManager(https://www.360docs.net/doc/643363808.html,Table);
nsmr.AddNamespace("ss", https://www.360docs.net/doc/643363808.html,spaceURI);
https://www.360docs.net/doc/643363808.html, = e.Attributes["Name", https://www.360docs.net/doc/643363808.html,spaceURI].Value;
XmlElement table = e.SelectSingleNode("ss:Table", nsmr) as XmlElement;
int row = -1;
foreach (XmlElement rowElement in table.SelectNodes("ss:Row", nsmr))
{
row = GetIndex(row, rowElement);
int column = -1;
foreach (XmlElement cellElement in rowElement.SelectNodes("ss:Cell", nsmr))
{
column = GetIndex(column, cellElement);
Cell cell = new Cell(this);
cell.Load(cellElement);
this[row, column] = cell;
}
}
}
private static int GetIndex(int index, XmlElement e)
{
if (e.Attributes["ss:Index"] != null)
{
return int.Parse(e.Attributes["ss:Index"].Value) - 1;
}
else
{
return index + 1;
}
}
}
}

===================================================================================================================

C#.Net Web 导出Excel最简单例子

//获取数据DataSet/DataTable/List<>/IList
protected DataSet GetList()
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "server=.;database=MyExample;uid=sa;pwd=123";
SqlDataAdapter sda = new SqlDataAdapter("SELECT * FROM AdminUsers", conn);
//DataTable tb = new DataTable();
DataSet ds = new DataSet();
sda.Fill(ds);
return ds;

}
//导出 Excel 只能按查询出来的数据导出,标题也没有修改
protected void Button1_Click(object sender, EventArgs e)
{
Response.Clear();
Response.Buffer = true;
Response.AddHeader("content-disposition", "attachment; filename=Book" + DateTime.Now.ToString("yyyyMMdd") + ".xls");
Response.ContentType = "application/vnd.ms-excel";
//Response.ContentType = "application/vnd.ms-word";
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.Charset = "";
this.EnableViewState = false;
StringWriter oStringWriter = new StringWriter();
HtmlTextWriter oHtmlTextWriter = new HtmlTextWriter(oStringWriter);
DataGrid dg = new DataGrid();
dg.DataSource = GetList(); //数据源DataSet/DataTable/List<>/IList
dg.DataBind();
dg.RenderControl(oHtmlTextWriter);
Response.Write(oStringWriter.ToString());

Response.End();
////导出整个页面到Excel/Word
//Response.Clear();
//Response.Buffer = true;
//Response.AppendHeader("Content-Disposition", "attachment;filename=" + DateTime.Now.ToString("yyyyMMdd") + ".doc");
//Response.ContentEncoding = System.Text.Encoding.UTF7;
////Response.ContentType = "application/vnd.ms-excel";
////Response.ContentType = "application/vnd.ms-word";
//Response.ContentType = "application/word";
//this.EnableViewState = false;
}

相关文档
最新文档