最近很多人问excel导入导出问题,关于这方面我原来很早发布过一个博客,但是显然,错误很多,导致大家复用之后出现各种各样的问题,做了无用功,这就很抱歉,所以这次我重新发一个尽量大家可以通用的。 我目前所了解的方法有三种:
1.vs本身自带的控件 Microsoft.Office.Interop.Excel
A.这种数据量一多会牵扯到一个效率问题
B.会遇到版本问题比较多(例如xls与xlsx,因为版本问题,可能那个格式就导入不进去)
2.NPOI控件(这种具体没怎么用过,大家可以下去试试)
3.Aspose控件(这种感觉还是比较实用,特别是效率方面很友好)
下面我们讲代码:
加载界面代码
private void frmImput_Load(object sender, EventArgs e)
{
//清楚下拉框数据
cmb_inTbName.Items.Clear();
//获取当前数据所有表名
strSql = "select table_name from information_schema.tables where table_schema='dbo'";
System.Data.DataTable dsTableName = DBHelper.getTable(strSql);//此处调用自己写的方法
//存入下拉框方便查询
foreach (DataRow dr in dsTableName.Rows)
{
cmb_inTbName.Items.Add(dr[0].ToString());
cmb_outTbName.Items.Add(dr[0].ToString());
}
}
导入界面(摘录自某同学)
界面上实际用到的只有文件路径/预览/导入,数据展示中是数据集合DataGridView,
这里做的操作就是将Excel表中数据展示到DataGridView
点击预览
当中代码
private System.Windows.Forms.OpenFileDialog openFileDialog = new OpenFileDialog();//打开文件
//---导入操作---
private void btn_inDataShow_Click(object sender, EventArgs e)
{
if (openFileDialog.ShowDialog() == DialogResult.OK)//判断是否选择打开文件
{
this.txt_inFileSelectPath.Text = openFileDialog.FileName;//将文件路径赋与文本框txt_inFileSelectPath
Import_Excel(openFileDialog.FileName);
}
}
导入代码
/// <summary>
/// 读取Excel文件数据到DataTable
/// </summary>
/// <param name="filePath">Excel文件路径</param>
private void Import_Excel(string filePath)
{
string sqlconn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties='Excel 8.0;HDR=False;IMEX=1'";
// string strConn = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + Server.MapPath("ExcelFiles/Mydata2007.xlsx") + ";Extended Properties='Excel 12.0; HDR=Yes; IMEX=1'"; //此连接可以操作.xls与.xlsx文件 (支持Excel2003 和 Excel2007 的连接字符串
string sql = @"select * from [Sheet1$]";
try
{
using (OleDbConnection conn = new OleDbConnection(sqlconn))
{
using (OleDbDataAdapter adapter = new OleDbDataAdapter(sql, conn))
{
System.Data.DataTable dt = new System.Data.DataTable();
adapter.Fill(dt);
dgvMain.DataSource = dt;//将数据展示到DataGridView
}
}
}
catch (Exception ex)
{
MessageBox.Show("打开文件出错,错误信息:" + ex.Message.ToString(), "提示");
}
}
这个版本测试过后缀为xls的Excel文件正常使用。
可能大部分新手就是需要这块的代码
至于如何将DataGridView数据导入数据库, 就是最基础的增加数据,这里就不贴代码了,只是说一下思路
1.遍历当前DataGirdView获取所有数据(for或者foreace)
2.将当前数据按对应名称依次 inset into 存入,这里可以一条一条加入,也可以批量添加
连接和增删改的方法写入到DBHelp中,然后调用就行,减少数据库重复调用。
基本直接复用,不用修改什么(除了你的数据库连接)
static private string connString = @"Data Source=LAPTOP-H1AVCBFB\SQLSERVER;Initial Catalog=yao;User Id=sa;Pwd=123";
// <summary>
/// 执行查询语句,返回DataSet
/// </summary>
/// <param name="SQLString"></param>
/// <returns></returns>
public static DataSet Query(string SQLString)
{
using (SqlConnection connection = new SqlConnection(connString))
{
DataSet ds = new DataSet();
try
{
connection.Open();
SqlDataAdapter command = new SqlDataAdapter(SQLString, connection);
command.Fill(ds, "ds");
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
return ds;
}
}
/// <summary>
/// 返回DataTable
/// </summary>
/// <param name="SQLString"></param>
/// <returns></returns>
public static DataTable getTable(string SQLString)
{
DataTable rtv = null;
DataSet ds = Query(SQLString);
if (ds.Tables.Count > 0)
{
rtv = ds.Tables[0];
}
return rtv;
}
关于导出(摘录自某同学)
这里是先根据下拉框查询出数据库所有表,点击查询按钮,将数据展示到DataGridView中,点击导出,导出Excel
当前查询代码
//查询当前表
private void btn_outSelect_Click(object sender, EventArgs e)
{
//清空Sql
strB.Clear();
//判断是否选择表名
if (cmb_outTbName.SelectedIndex > -1)
{
strB.Append("select * from " + cmb_outTbName.Text + "");
dgv_outMain.DataSource = DBHelper.getTable(strB.ToString());
}
else
{
MsgBoxErr("请选择表名!", "");
}
}
报错信息提示:
public static void MsgBoxErr(string paraMsg, string paraTitle)
{
if (string.IsNullOrEmpty(paraTitle))
{
paraTitle = "提示";
}
MessageBox.Show(paraMsg, paraTitle, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
根据查询当前数据已经展示到DataGridView中,下面导出
点击导出按钮:
private void btn_outExcel_Click(object sender, EventArgs e)
{
//string desktop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
ExportExcels(cmb_outTbName.Text, dgv_outMain);
}
这里传递的是当前下拉框的值和当前DataGridView的名称
调用方法
/// <summary>
///
/// </summary>
/// <param name="fileName">文件路径</param>
/// <param name="myDGV">控件DataGridView</param>
private void ExportExcels(string fileName, DataGridView myDGV)
{
string saveFileName = "";
SaveFileDialog saveDialog = new SaveFileDialog();
saveDialog.DefaultExt = "xls";
saveDialog.Filter = "Excel文件|*.xls";
saveDialog.FileName = fileName;
saveDialog.ShowDialog();
saveFileName = saveDialog.FileName;
if (saveFileName.IndexOf(":") < 0) return; //被点了取消
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
if (xlApp == null)
{
MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel");
return;
}
Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;
Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];//取得sheet1
//写入标题
for (int i = 0; i < myDGV.ColumnCount; i++)
{
worksheet.Cells[1, i + 1] = myDGV.Columns[i].HeaderText;
}
//写入数值
for (int r = 0; r < myDGV.Rows.Count; r++)
{
for (int i = 0; i < myDGV.ColumnCount; i++)
{
worksheet.Cells[r + 2, i + 1] = myDGV.Rows[r].Cells[i].Value;
}
System.Windows.Forms.Application.DoEvents();
}
worksheet.Columns.EntireColumn.AutoFit();//列宽自适应
if (saveFileName != "")
{
try
{
workbook.Saved = true;
workbook.SaveCopyAs(saveFileName);
}
catch (Exception ex)
{
MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message);
}
}
xlApp.Quit();
GC.Collect();//强行销毁
MessageBox.Show("文件: " + fileName + ".xls 保存成功", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
这里基本直接复用就可以。
关于VS自带控件引用
右键-添加引用-程序集-扩展
就可以看到
|
请发表评论