halcon 将数据保存到excel_用C#操作Excel文件,实现与Sqlserver数据库进行导入与导出的操作。...

【实例简介】

用C#3层结构对Excel文件与SqlServer数据库进行导入与导出

【实例截图】

1.将数据库中数据导出Excel文件中,其原理是先将数据库中的你所选择的一张表,先加载到DataGridView上,然后将DataGridView中的数据填充到Excel文件(*.xls|.xlsx)中。

【核心代码】

将Excel文件加载到数据库中的代码

using System;

using System.Data;

using System.Data.OleDb;

using System.Data.SqlClient;

using System.Windows.Forms;

namespace OperationExcel.DAL

{

public class ExcelToSQL

{

DBUnti _db = new DBUnti();

public void ExcelToSql()

{

OpenFileDialog fd = new OpenFileDialog();

fd.Filter = "导入SQL数据库|*.xlsx;*.xls";//打开文件对话框筛选器

if (fd.ShowDialog() == DialogResult.OK)

{

TransferData(fd.FileName, "Sheet1", _db.connstr); //数据库表中名称

}

}

public void TransferData(string excelFile, string sheetName, string connectionString)

{

DataSet ds = new DataSet();

try

{

string strConn = "";

strConn = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source=" excelFile ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";   //版本不一样,都写一下

strConn = "Provider = Microsoft.ACE.OLEDB.12.0;Data Source=" excelFile ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1'"; //版本不一样,都写一下

OleDbConnection conn = new OleDbConnection(strConn);

conn.Open();

string strExcel = "";

OleDbDataAdapter myCommand;

strExcel = string.Format("select * from [{0}$]", sheetName);

myCommand = new OleDbDataAdapter(strExcel, strConn);

myCommand.Fill(ds, sheetName);

//如果目标表不存在则创建,excel文件的第一行为列标题,从第二行开始全部都是数据记录

string strSql = string.Format("if not exists(select * from sysobjects where name = '{0}') create table {0}(", sheetName);   //以sheetName为表名

foreach (DataColumn c in ds.Tables[0].Columns)

{

strSql = string.Format("[{0}] varchar(50),", c.ColumnName);

}

strSql = strSql.Trim(',') ")";

using (SqlConnection sqlconn = new SqlConnection(connectionString))

{

sqlconn.Open();

SqlCommand command = sqlconn.CreateCommand();

command.CommandText = strSql;

command.ExecuteNonQuery();

sqlconn.Close();

}

//用bcp导入数据

//excel文件中列的顺序必须和数据表的列顺序一致,因为数据导入时,是从excel文件的第二行数据开始,不管数据表的结构是什么样的,反正就是第一列的数据会插入到数据表的第一列字段中,第二列的数据插入到数据表的第二列字段中,以此类推,它本身不会去判断要插入的数据是对应数据表中哪一个字段的

using (SqlBulkCopy bcp = new SqlBulkCopy(connectionString))

{

bcp.BatchSize = 100;//每次传输的行数

bcp.NotifyAfter = 100;//进度提示的行数

bcp.DestinationTableName = sheetName;//目标表

bcp.WriteToServer(ds.Tables[0]);

}

MessageBox.Show("导入数据库成功!");

}

catch (Exception ex)

{

MessageBox.Show(ex.Message, "导入失败!");

}

}

}

}

将数据库中文件加载到Excel中

using Microsoft.Office.Interop.Excel;

using System;

using System.Data;

using System.Data.SqlClient;

using System.Windows.Forms;

namespace OperationExcel.DAL

{

public  class SQLToExcel

{

//DAL层 将数据库的数据导出到Excel上

public void printAll(DataGridView dgv)

{

try

{

SaveFileDialog saveFileDialog = new SaveFileDialog();

saveFileDialog.Filter = "导出Excel (*.xlsx)|*.xlsx";

saveFileDialog.FilterIndex = 0;

saveFileDialog.RestoreDirectory = true;

saveFileDialog.CreatePrompt = true;

saveFileDialog.Title = "导出文件保存路径";

saveFileDialog.ShowDialog();

string strName = saveFileDialog.FileName;

if (strName.Length != 0)

{

//没有数据的话就不往下执行

if (dgv.Rows.Count == 0)

return;

System.Reflection.Missing miss = System.Reflection.Missing.Value;

Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();

excel.Application.Workbooks.Add(true);

excel.Visible = true;//若是true,则在导出的时候会显示EXcel界面。

if (excel == null)

{

MessageBox.Show("EXCEL无法启动!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);

return;

}

Workbooks books = excel.Workbooks;

Workbook book = books.Add(miss);

Worksheet sheet = (Worksheet)book.ActiveSheet;

sheet.Name = "Sheet1";

//生成Excel中列头名称

for (int i = 0; i < dgv.Columns.Count; i )

{

if (dgv.Columns[i].Visible == true)

{

excel.Cells[1, i 1] = dgv.Columns[i].HeaderText;

}

}

//把DataGridView当前页的数据保存在Excel中

for (int i = 0; i < dgv.Rows.Count - 1; i )//从第二行开始打印

{

System.Windows.Forms.Application.DoEvents();

for (int j = 0; j < dgv.Columns.Count; j )

{

if (dgv.Columns[j].Visible == true)

{

if (dgv[j, i].ValueType == typeof(string))

{

excel.Cells[i 2, j 1] = dgv[j, i].Value.ToString();

}

else

{

excel.Cells[i 2, j 1] = dgv[j, i].Value.ToString();

}

}

}

}

sheet.SaveAs(strName, miss, miss, miss, miss, miss, XlSaveAsAccessMode.xlNoChange, miss, miss, miss);

book.Close(false, miss, miss);

books.Close();

excel.Quit();

System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);

System.Runtime.InteropServices.Marshal.ReleaseComObject(book);

System.Runtime.InteropServices.Marshal.ReleaseComObject(books);

System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);

GC.Collect();

MessageBox.Show("数据已经成功导出!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

System.Diagnostics.Process.Start(strName);

}

}

catch (Exception ex)

{

MessageBox.Show(ex.Message, "导出失败!");

}

}

}

}

本人QQ:1150801389

不足之处希望相关学者多多指点,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值