导入excel代码
using Microsoft.Office.Interop;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.Reflection;
private void button3_Click(object sender, EventArgs e)
{
if (ChoicePath())
{
//创建一个Excel文件
CreateExcel();
//获取SqlServer表内容,存放到dsSqlServer里面
GetDs();
//导入数据到Excel
InsertToExcel();
}
}
#region SqlServer导入到Excel
//新创建的Excel文件路径
public string strSaveFileName;
//存放SqlServer内容
public DataSet dsSqlServer;
/// <summary>
/// 选择Excel的保存路径
/// </summary>
/// <returns>已经选择好文件路径则返回true, 否则false</returns>
public bool ChoicePath()
{//保存对话框
SaveFileDialog savePath = new SaveFileDialog();
if (savePath.ShowDialog() == DialogResult.OK)
{
strSaveFileName = savePath.FileName;
//判断文件是否已存在
if (IsExist(strSaveFileName))
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
/// <summary>
/// 判断文件是否已存在,存在则询问是否覆盖
/// </summary>
/// <param name="fileName">文件路径</param>
/// <returns>“不存在”或“存在并允许覆盖”返回true, 存在但不覆盖返回false</returns>
public bool IsExist(string fileName)
{
//判断文件是否已存在
if (System.IO.File.Exists(fileName + ".xls"))
{ //提示是否覆盖
//删除已有文件
System.IO.File.Delete(fileName + ".xls");
return true;
}
return true;
}
/// <summary>
/// 获取SqlServer内容,存放到dsSqlServer里面
/// </summary>
public void GetDs()
{
//要执行的sql语句
String strSql = "select 。。。";//输入查询条件
//创建连接
string con ="server=.;database=user;Trusted_Connection=SSPI";
SqlConnection sqlCon = new SqlConnection(con);
dsSqlServer = new DataSet();
sqlCon.Open();
//.......
SqlDataAdapter sqlDa = new SqlDataAdapter(strSql, sqlCon);
dsSqlServer = new DataSet();
//查询到的数据保存到ds
sqlDa.Fill(dsSqlServer);
sqlCon.Close();
}
/// <summary>
/// 创建Excel文件,在我的其它文章里,有讲这方面内容,不清楚的可翻看前面章节
/// </summary>
private void CreateExcel()
{
//创建Excel对象
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
//创建新的Excel工作簿
Microsoft.Office.Interop.Excel.Workbook wBook = excel.Application.Workbooks.Add(Missing.Value);
//使Excel不可视
excel.Visible = false;
//设置禁止弹出保存和覆盖的询问提示框
excel.DisplayAlerts = false;
excel.AlertBeforeOverwriting = true;
//保存
wBook.SaveAs(strSaveFileName,
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);
wBook = null;
//必须有该语句,才能有效结束,否则每次运行会产生一个Excel
excel.Quit();
excel = null;
}
/// <summary>
/// 把数据导入Excel
/// </summary>
private void InsertToExcel()
{
//下面是Excel数据库访问操作:
//连接字符串
string strCon = "Provider=Microsoft.ACE.OLEDB.12.0;data source=" + strSaveFileName + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=0'";
//要执行的sql语句,采用stringbuilder类
StringBuilder strbSql = new StringBuilder();
//创建OleDb连接对象.
OleDbConnection oleDbCon = new OleDbConnection(strCon);
//创建执行对象
OleDbCommand oleDbCom = new OleDbCommand();
//赋予连接对象
oleDbCom.Connection = oleDbCon;
//打开连接
oleDbCon.Open();
//下面是数据插入到Excel
try
{
//创建一张新的工作表,表名为MySheet。你或许疑惑为什么不在原有的工作区Sheet1里导入,在后面我会讲到!
string strSql = "create table MySheet ([xx] 类型,[xx] 类型,....] varchar(50)) ";
//赋予sql语句
oleDbCom.CommandText = strSql;
//执行sql语句,创建一个新表
oleDbCom.ExecuteNonQuery();
//循环插入数据
for (int i = 0; i < dsSqlServer.Tables[0].Rows.Count; i++)
{
//要注意 参数要用 ' '括起来的。例如: 'value'
strbSql.Append("insert into [MySheet$] values('");
for (int j = 0; j < 4; j++)
{
strbSql.Append(dsSqlServer.Tables[0].Rows[i].ItemArray[j].ToString() + "','");
}
strbSql.Append(dsSqlServer.Tables[0].Rows[i].ItemArray[4].ToString() + "')");
//stringbuilder转为string类型,因为sql语句不能直接执行stringbuilder类
strSql = strbSql.ToString();
oleDbCom.CommandText = strSql;
oleDbCom.ExecuteNonQuery();
//清除strbSql过往信息
strbSql.Remove(0, strbSql.Length);
}
//插入成功提示
MessageBox.Show("导入Excel成功!请查看!:", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
//失败提示
MessageBox.Show("导入Excel过程中发生错误!/n错误提示:" + ex.Message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
oleDbCon.Close();
}
}
/// <summary>
/// 导入数据到Excel
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void bntToExcel_Click(object sender, EventArgs e)
{
//判断是否选择好路径
if(ChoicePath())
{
//创建一个Excel文件
CreateExcel();
//获取SqlServer表内容,存放到dsSqlServer里面
GetDs();
//导入数据到Excel
InsertToExcel();
}
}
#endregion
原文链接: https://blog.csdn.net/kkfdsa132/article/details/5483067?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158695406019725211923989%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=158695406019725211923989&biz_id=0&utm_source=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-1
遇到的问题
1.关于access连接字符串
当IMEX=0 时为“汇出模式”,这个模式开启的 Excel 档案只能用来做“写入”用途。
当 IMEX=1 时为“汇入模式”,这个模式开启的 Excel 档案只能用来做“读取”用途。
当 IMEX=2 时为“连結模式”,这个模式开启的 Excel 档案可同时支援“读取”与“写入”用途。
原文链接:https://blog.csdn.net/GreyCastle/article/details/100079739
导入到excel原文章作者的连接使用的是Provider = Microsoft.Jet.OLEDB.4.0;Data Source = ‘" + strSaveFileName + "’;Extended Properties=‘Excel 8.0;HDR=NO’";这个连接只支持2003版本,以后的版本使用我现在改的。
- 使用Microsoft.ACE.OLEDB.12.0时可能出现
- 提示"找不到可安装的ISAM":
*win+R,64位 输入Regsvr32 C:\Windows\SysWOW64\msexcl40.dll
32位输入 Regsvr32 C:\Windows\SysWOW32\msexcl40.dll - 未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序解决办法
链接:https://pan.baidu.com/s/1I-hx_-TUc9y3LIY9uEn1xw
提取码:19hu
安装即可
- 其他一些小问题
- 字段定义语法错误
创建excel工作表时 注意类型是否正确,好像在一篇文章中看到bool要写成bit - 注意数据库连接字符串和access连接字符串的格式是否正确
- 注意要导出的表的格式与创建excel工作表的格式是否统一
- 过程中还涉及文件夹的访问权限 不知道是我操作不当还是也存在这个问题 还是记录一下(应该不存在这个问题)
- 右键选择要存储的文件,点击属性–>最上面点击安全–>右下角点击高级–>左下角点击添加–>左上角选择主题 -->输入要选择的对象名称:everyone–>勾选写入(我是选了完全控制)–>确定
- Microsoft.Office.Interop报错;
- 添加引用 COM类型库里的 Microsoft Excel 16.0 Object LIbrary和Microsoft Office 16.0 Object LIbrary
总结
第一次接触sql和access还是有太多不懂的地方,把别人的方法写到自己程序还是废了好大功夫,不过还是学到了很多,第一次使用markdown排版可能比较随意,重在积累!