您的位置:首页 > 编程语言 > C#

C#语言的Excel文件导入导出

2012-02-03 21:09 393 查看
Microsoft.Office.Tools.Excel 命名空间(引用的Com组件),微软msdn帮助
http://msdn.microsoft.com/zh-cn/library/microsoft.office.tools.excel(VS.80).aspx
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.OleDb;
using System.Data.Odbc;
using Excel=Microsoft.Office.Interop.Excel;
using System.Collections;
using System.Windows.Forms;

/**********************
* 作者:王凌云
* 日期:2011年3月6日
* 功能:Excel文件的导入导出等功能
**********************/
namespace OfficeHelper
{
public class ToExcel
{
private Excel.Application _app = null;
private Excel.Workbook _workbook = null;
private Excel.Worksheet _worksheet = null;
private Excel.Range _range = null;
private bool _visible = true;
private bool _exportTitle = false;
private string _title = "";
private object _missing = System.Reflection.Missing.Value;
private object _fileName;
/// <summary>
/// 导出excel的标题
/// </summary>
public string Title
{
get { return _title; }
set { _title = value; }
}
/// <summary>
/// 当前表单
/// </summary>
public Excel.Worksheet CurrentWorkSheet
{
get { return _worksheet; }
set { _worksheet = value; }
}
/// <summary>
/// 当前Excel文档
/// </summary>
public Excel.Workbook CurrentWorkBook
{
get { return _workbook; }
set { _workbook = value; }
}
/// <summary>
/// 当前Excel应用
/// </summary>
public Excel.Application ExcelApp
{
get { return _app; }
set { _app = value; }
}
/// <summary>
/// Excel文档的可见性
/// </summary>
public bool ExcelVisible
{
get { return _visible; }
set { _visible = value; }
}
/// <summary>
/// 是否导出标题
/// </summary>
public bool ExprotTitle
{
get { return _exportTitle; }
set { _exportTitle = value; }
}

/// <summary>
/// 构造函数,无代码
/// </summary>
public ToExcel()
{
}
/// <summary>
/// 构造函数,初始化Excel应用
/// </summary>
/// <param name="visible">Excel文档是否可见</param>
public ToExcel(bool visible)
{
try
{
_app = new Excel.Application();
_visible = visible;
_app.Visible = _visible;
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 析构函数
/// </summary>
~ToExcel()
{
try
{
if (_app != null && _app.Visible == false)
{
_app.Quit();
}
}
catch
{
}
}
/// <summary>
/// 初始化app属性
/// </summary>
public void InitApp()
{
try
{
if (_app == null)
_app = new Excel.Application();
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 初始化wookbook属性
/// </summary>
public void InitBook()
{
InitApp();
try
{
if (_workbook == null)
_workbook = _app.Workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
}
catch (Exception ex)
{

throw ex;
}

}
/// <summary>
/// 创建Excel文档
/// </summary>
public Excel.Workbook CreateBook()
{
Excel.Workbook book = null;
try
{
book = _app.Workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
}
catch (Exception ex)
{

throw ex;
}
return book;
}
/// <summary>
/// 创建Excel文档
/// </summary>
/// <param name="templete">Excel文档创建模板</param>
/// <returns></returns>
public Excel.Workbook CreateBook(object templete)
{
Excel.Workbook book = null;
try
{
book = _app.Workbooks.Add(templete);
}
catch (Exception ex)
{
throw ex;
}
return book;
}
/// <summary>
/// 打开Excel
/// </summary>
/// <param name="fileName">文件名</param>
public Excel.Workbook OpenBook(string fileName)
{
Excel.Workbook book = null;
_fileName = fileName;
try
{
book = _app.Workbooks.Open(fileName, _missing, _missing, _missing,
_missing, _missing, _missing, _missing, _missing, _missing, _missing,
_missing, _missing, _missing, _missing);
}
catch (Exception ex)
{

throw ex;
}
return book;
}
/// <summary>
/// 获得表单对象
/// </summary>
/// <param name="workbook"></param>
/// <param name="sheetIndex"></param>
/// <returns></returns>
public Excel.Worksheet GetSheet(Excel.Workbook workbook, int sheetIndex)
{
Excel.Worksheet sheet = null;
try
{
sheet = (Excel.Worksheet)workbook.Sheets[sheetIndex];
}
catch (Exception ex)
{
throw ex;
}
return sheet;
}
/// <summary>
/// 获得表单对象
/// </summary>
/// <param name="sheetIndex"></param>
/// <returns></returns>
public Excel.Worksheet GetSheet(int sheetIndex)
{
InitBook();
Excel.Worksheet sheet = null;
try
{
sheet = (Excel.Worksheet)_workbook.Sheets[sheetIndex];
}
catch (Exception ex)
{
throw ex;
}
return sheet;
}
/// <summary>
/// DataTable数据导入Excel
/// </summary>
/// <param name="dtDetail">导出数据的数据源</param>
/// <param name="columnName">数据源中的字段名称</param>
/// <param name="columnDiscription">字段描述</param>
public void DataTableToExcel(DataTable dtDetail, string[] columnName, string[] columnDiscription)
{
if (dtDetail == null)
{
return;
}
if (columnName.Length == 0 || columnName.Length != columnDiscription.Length)
{
return;
}
try
{
//设置标题
int titleRow = 0;
int colsLen = columnName.Length;
_worksheet = GetSheet(1);
_range = _worksheet.get_Range(_worksheet.Cells[1, 1], _worksheet.Cells[1, colsLen]);
if (_exportTitle)
{
titleRow = 1;
_range.Merge(0);
_range.Value2 = _title;
_range.NumberFormat = "@";
_range.Font.Size = 20;
_range.Font.Bold = true;
_range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
_range.RowHeight = 40;
}
//设置表头
_range = _worksheet.get_Range(_worksheet.Cells[1 + titleRow, 1], _worksheet.Cells[1 + titleRow, colsLen]);
_range.Font.Size = 10;
_range.Font.Bold = true;
_range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
_range.NumberFormat = "@";
//_range.ColumnWidth = 10;
_range.Borders.ColorIndex = 1;
for (int i = 1; i <= colsLen; i++)
{
_worksheet.Cells[1 + titleRow, i] = columnDiscription[i - 1];
//_range = (Excel.Range)_worksheet.Cells[1, i];
//_range.Value2 = columns;
}
//导出数据
int rowsLen = 2 + titleRow;
_range = _worksheet.get_Range(_worksheet.Cells[2 + titleRow, 1], _worksheet.Cells[2 + dtDetail.Rows.Count, colsLen]);
_range.NumberFormat = "@";
_range.Font.Size = 10;
_range.Borders.ColorIndex = 1;
foreach (DataRow dr in dtDetail.Rows)
{
for (int i = 1; i <= colsLen; i++)
{
_worksheet.Cells[rowsLen, i] = dr[columnName[i-1]].ToString();
}
rowsLen++;
}
_range = _worksheet.get_Range(_worksheet.Cells[1, 1], _worksheet.Cells[1, colsLen]);
_range.EntireColumn.AutoFit();
}
catch (Exception ex)
{

throw ex;
}

}
/// <summary>
/// DataTable数据导入Excel
/// </summary>
/// <param name="dtDetail">导出数据的数据源</param>
/// <param name="columnName">数据源中的字段名称</param>
/// <param name="columnDiscription">字段描述</param>
/// <param name="pBar">状态栏进度条</param>
public void DataTableToExcel(DataTable dtDetail, string[] columnName, string[] columnDiscription, ToolStripProgressBar pBar)
{
//数据源为空,字符串数组为空,字段名和字段描述个数不相等,返回
if (dtDetail == null)
{
return;
}
if (columnName.Length == 0 || columnName.Length != columnDiscription.Length)
{
return;
}
try
{
//设置进度条
int detailCount = dtDetail.Rows.Count;
pBar.Maximum = detailCount;
pBar.Minimum = 0;
pBar.Value = 0;
pBar.Step = 4;
pBar.Visible = true;
//设置标题
int titleRow = 0;
int colsLen = columnName.Length;
_worksheet = GetSheet(1);
_range = _worksheet.get_Range(_worksheet.Cells[1, 1], _worksheet.Cells[1, colsLen]);
if (_exportTitle)
{
titleRow = 1;
_range.Merge(0);
_range.Value2 = _title;
_range.NumberFormat = "@";
_range.Font.Size = 20;
_range.Font.Bold = true;
_range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
_range.RowHeight = 40;
}
//设置表头
_range = _worksheet.get_Range(_worksheet.Cells[1 + titleRow, 1], _worksheet.Cells[1 + titleRow, colsLen]);
_range.Font.Size = 10;
_range.Font.Bold = true;
_range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
_range.NumberFormat = "@";
_range.Borders.ColorIndex = 1;
for (int i = 1; i <= colsLen; i++)
{
_worksheet.Cells[1 + titleRow, i] = columnDiscription[i - 1];
}
//导出数据
int rowsLen = 2 + titleRow;
_range = _worksheet.get_Range(_worksheet.Cells[2 + titleRow, 1], _worksheet.Cells[2 + dtDetail.Rows.Count, colsLen]);
_range.NumberFormat = "@";
_range.Font.Size = 10;
_range.Borders.ColorIndex = 1;
for (int i = 0; i < detailCount; i++)
{
if ((i % 4) == 0)
pBar.PerformStep();
for (int j = 1; j <= colsLen; j++)
{
_worksheet.Cells[rowsLen, j] = dtDetail.Rows[i][columnName[j - 1]].ToString();
}
rowsLen++;
}
_range.EntireColumn.AutoFit();
}
catch (Exception ex)
{
throw ex;
}
finally
{
pBar.Visible = false;
}
}
/// <summary>
/// DataTable数据导入Excel
/// </summary>
/// <param name="dtDetail">导出数据的数据源</param>
/// <param name="columnName">数据源中的字段名称</param>
/// <param name="columnDiscription">字段描述</param>
public void DataTableToExcelSaved(DataTable dtDetail, string[] columnName, string[] columnDiscription)
{

SaveFileDialog saveDialog = new SaveFileDialog();
saveDialog.InitialDirectory = Application.ExecutablePath.ToString();

saveDialog.Filter = "Excel文件(*.xls)|*.xls|CSV文件(*.csv)|*.csv";
saveDialog.FilterIndex = 1;
saveDialog.RestoreDirectory = true;

if (saveDialog.ShowDialog() == DialogResult.OK)
{
DataTableToExcel(dtDetail, columnName, columnDiscription);
}
}
/// <summary>
/// DataTable数据导入Excel
/// </summary>
/// <param name="dtDetail">导出数据的数据源</param>
/// <param name="columnName">数据源中的字段名称</param>
/// <param name="columnDiscription">字段描述</param>
/// <param name="pBar">状态栏进度条</param>
public void DataTableToExcelSaved(DataTable dtDetail, string[] columnName, string[] columnDiscription, ToolStripProgressBar pBar)
{
SaveFileDialog saveDialog = new SaveFileDialog();
saveDialog.InitialDirectory = Application.ExecutablePath.ToString();

saveDialog.Filter = "Excel文件(*.xls)|*.xls|CSV文件(*.csv)|*.csv";
saveDialog.FilterIndex = 1;
saveDialog.RestoreDirectory = true;

if (saveDialog.ShowDialog() == DialogResult.OK)
{
DataTableToExcel(dtDetail, columnName, columnDiscription,pBar);
}
}
/// <summary>
/// DataGridView数据导入Excel
/// </summary>
/// <param name="gvDetail">数据源</param>
/// <param name="columnName">数据源中字段名称</param>
/// <param name="columnDiscription">字段描述</param>
public void DataGridViewToExcel(DataGridView gvDetail, string[] columnName, string[] columnDiscription)
{
if (gvDetail == null)
{
return;
}
if (columnName.Length == 0 || columnName.Length != columnDiscription.Length)
{
return;
}
try
{
//设置Excel标题
int titleRow = 0;
int colsLen = columnName.Length;
_worksheet = GetSheet(1);
_range = _worksheet.get_Range(_worksheet.Cells[1, 1], _worksheet.Cells[1, colsLen]);
if (_exportTitle)
{
titleRow = 1;
_range.Merge(0);
_range.Value2 = _title;
_range.NumberFormat = "@";
_range.Font.Size = 20;
_range.Font.Bold = true;
_range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
_range.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;
_range.RowHeight = 40;
}
//设置Excel表头
_range = _worksheet.get_Range(_worksheet.Cells[1 + titleRow, 1], _worksheet.Cells[1 + titleRow, colsLen]);
_range.Font.Size = 10;
_range.Font.Bold = true;
_range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
_range.NumberFormat = "@";
_range.Borders.ColorIndex = 1;
for (int i = 1; i <= colsLen; i++)
{
_worksheet.Cells[1 + titleRow, i] = columnDiscription[i - 1];
}
//导出数据
int rowsLen = 2 + titleRow;
_range = _worksheet.get_Range(_worksheet.Cells[2 + titleRow, 1], _worksheet.Cells[2 + gvDetail.Rows.Count, colsLen]);
_range.NumberFormat = "@";
_range.Font.Size = 10;
_range.Borders.ColorIndex = 1;
foreach (DataGridViewRow gvRow in gvDetail.Rows)
{
for (int i = 1; i <= colsLen; i++)
{
_worksheet.Cells[rowsLen, i] = gvRow.Cells[columnName[i - 1]].Value.ToString();
}
rowsLen++;
}
_range.EntireColumn.AutoFit();
}
catch (Exception ex)
{

throw ex;
}

}
/// <summary>
/// DataGridView数据导入Excel
/// </summary>
/// <param name="gvDetail">数据源</param>
/// <param name="columnName">数据源中字段名称</param>
/// <param name="columnDiscription">字段描述</param>
/// <param name="pBar">进度条</param>
public void DataGridViewToExcel(DataGridView gvDetail, string[] columnName, string[] columnDiscription, ToolStripProgressBar pBar)
{
if (gvDetail == null)
{
return;
}
if (columnName.Length == 0 || columnName.Length != columnDiscription.Length)
{
return;
}
try
{
//设置进度条
int detailCount = gvDetail.Rows.Count;
pBar.Maximum = detailCount;
pBar.Minimum = 0;
pBar.Value = 0;
pBar.Step = 4;
pBar.Visible = true;

//设置Excel标题
int titleRow = 0;
int colsLen = columnName.Length;
_worksheet = GetSheet(1);
_range = _worksheet.get_Range(_worksheet.Cells[1, 1], _worksheet.Cells[1, colsLen]);
if (_exportTitle)
{
titleRow = 1;
_range.Merge(0);
_range.Value2 = _title;
_range.NumberFormat = "@";
_range.Font.Size = 20;
_range.Font.Bold = true;
_range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
_range.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;
_range.RowHeight = 40;
}
//设置Excel表头
_range = _worksheet.get_Range(_worksheet.Cells[1 + titleRow, 1], _worksheet.Cells[1 + titleRow, colsLen]);
_range.Font.Size = 10;
_range.Font.Bold = true;
_range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
_range.NumberFormat = "@";
_range.Borders.ColorIndex = 1;
for (int i = 1; i <= colsLen; i++)
{
_worksheet.Cells[1 + titleRow, i] = columnDiscription[i - 1];
}
//导出数据
int rowsLen = 2 + titleRow;
_range = _worksheet.get_Range(_worksheet.Cells[2 + titleRow, 1], _worksheet.Cells[2 + gvDetail.Rows.Count, colsLen]);
_range.NumberFormat = "@";
_range.Font.Size = 10;
_range.Borders.ColorIndex = 1;
for (int i = 0; i < detailCount; i++)
{
if ((i % 4) == 0)
pBar.PerformStep();
for (int j = 1; j <= colsLen; j++)
{
_worksheet.Cells[rowsLen, j] = gvDetail.Rows[i].Cells[columnName[j - 1]].Value.ToString();
}
rowsLen++;
}
_range.EntireColumn.AutoFit();
}
catch (Exception ex)
{

throw ex;
}
finally
{
pBar.Visible = false;
}

}
/// <summary>
/// DataTable数据导入Excel
/// </summary>
/// <param name="dtDetail">导出数据的数据源</param>
/// <param name="columnName">数据源中的字段名称</param>
/// <param name="columnDiscription">字段描述</param>
public void DataGridViewToExcelSaved(DataGridView gvDetail, string[] columnName, string[] columnDiscription)
{

SaveFileDialog saveDialog = new SaveFileDialog();
saveDialog.InitialDirectory = Application.ExecutablePath.ToString();

saveDialog.Filter = "Excel文件(*.xls)|*.xls|CSV文件(*.csv)|*.csv";
saveDialog.FilterIndex = 1;
saveDialog.RestoreDirectory = true;

if (saveDialog.ShowDialog() == DialogResult.OK)
{
DataGridViewToExcel(gvDetail, columnName, columnDiscription);
}
}
/// <summary>
/// DataTable数据导入Excel
/// </summary>
/// <param name="dtDetail">导出数据的数据源</param>
/// <param name="columnName">数据源中的字段名称</param>
/// <param name="columnDiscription">字段描述</param>
/// <param name="pBar">状态栏进度条</param>
public void DataGridViewToExcelSaved(DataGridView gvDetail, string[] columnName, string[] columnDiscription, ToolStripProgressBar pBar)
{
SaveFileDialog saveDialog = new SaveFileDialog();
saveDialog.InitialDirectory = Application.ExecutablePath.ToString();

saveDialog.Filter = "Excel文件(*.xls)|*.xls|CSV文件(*.csv)|*.csv";
saveDialog.FilterIndex = 1;
saveDialog.RestoreDirectory = true;

if (saveDialog.ShowDialog() == DialogResult.OK)
{
DataGridViewToExcel(gvDetail, columnName, columnDiscription, pBar);
}
}

/// <summary>
/// 查找Excel文档中的表单并设定其为当前表单,当前表单赋值给CurrentSheet属性
/// </summary>
/// <param name="worksheetName">表单名称</param>
/// <returns>找到时返回真</returns>
public bool FindExcelWorksheet(Excel.Workbook workbook, string worksheetName)
{
bool ATP_SHEET_FOUND = false;

if ( workbook != null)
{
for (int i = 1; i <= workbook.Worksheets.Count; i++)
{
_worksheet = (Excel.Worksheet)workbook.Worksheets.get_Item((object)i);
if (_worksheet.Name.Equals(worksheetName))
{
_worksheet.Activate();
ATP_SHEET_FOUND = true;
return ATP_SHEET_FOUND;
}
}
}
return ATP_SHEET_FOUND;
}
/// <summary>
/// 关闭Excel文档
/// </summary>
public void CloseFile()
{
_workbook.Close(false,_fileName,false);
}
/// <summary>
/// 终止Excel程序
/// </summary>
public void StopExcel()
{
if (this._app != null)
{
System.Diagnostics.Process[] pProcess;
pProcess = System.Diagnostics.Process.GetProcessesByName("Excel");
pProcess[0].Kill();
}
}
/// <summary>
/// 导入CSV文件到DataSet
/// </summary>
/// <param name="fileCSV">文件全路径</param>
/// <param name="numberOfRows">导入记录个数,-1为全部倒入</param>
/// <returns></returns>
public DataSet LoadCSV(string fileCSV, int numberOfRows)
{
System.IO.FileInfo fi = new System.IO.FileInfo(fileCSV);
string fileNevCSV = fi.Name.ToString();
DataSet ds = new DataSet();
try
{
string strConn = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" + fi.DirectoryName.ToString() + ";Extensions=asc,csv,tab,txt;Persist Security Info=False";
string sql;
OdbcConnection conn;
conn = new OdbcConnection(strConn.Trim());
conn.Open();
if (numberOfRows == -1)
{
sql = "select * from [" + fileNevCSV + "]";
}
else
{
sql = "select top " + numberOfRows + " * from [" + fileNevCSV + "]";
}
OdbcDataAdapter da = new OdbcDataAdapter(sql, conn);
da.Fill(ds, "csv");
conn.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error:导入CSV", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
return ds;
}
/// <summary>
/// 导入Excel文件到DataSet(问题:导入后自动转换格式,有整数和小数的列小数会丢失)
/// </summary>
/// <param name="Path"></param>
/// <returns></returns>
public DataSet LoadExcel(string Path)
{
DataSet ds = new DataSet();
try
{
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Path + ";" + "Extended Properties=Excel 8.0;";
OleDbConnection conn = new OleDbConnection(strConn);
conn.Open();
string strExcel = "select * from [sheet1$]";
OleDbDataAdapter myCommand = new OleDbDataAdapter(strExcel, strConn);
myCommand.Fill(ds, "table1");
conn.Close();
}
catch (Exception ex)
{

throw ex;
}
return ds;

}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: