C# 中的对excel的操作

 

用来操作excel

excel中,因为要操作非托管类型的Office,如果只是用一般的关闭方式,就回出现excel关闭后。

在任务管理器中出现大量的excel进程的现象。

所以,关于关闭excel的时候,就是用了导入Windows 类库,可以获得进程Id,用来关闭excel的方法。来直接关闭在任务管理器中的excel进程。

这段代码事例当时是运用在多线程的情况下,所以有的参数获取用的是在外部调用构造函数来传递。

内部接受公共私有字段的值。

导出的操作,主要设计到从打dataGridView中获取数据,并导出excel

导入的操作 的UpdatePayHistory();是因为项目需求而编写的 导入数据到数据库中的方法。

这里的操作可以根据需要来选择

excel的导入导出操作

    public  class HandleExcel
{
//导入Windows 类库,可以获得进程Id,用来关闭excel
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);

#region 用来接受参数的构造方法和属性
//两个接受参数的构造方法
private string filePath = null;
private string sheetName = null;
/// <summary>
/// 用来传递导入excel参数的构造方法
/// </summary>
/// <param name="FilePath">excel文件的路径</param>
public HandleExcel(string FilePath, string SheetName)
{
this.filePath = FilePath;
this.sheetName = SheetName;
}
private List<Int32> List = null;
private DataGridView dgv = null;
/// <summary>
/// 用来传递导出excel参数的构造方法
/// </summary>
/// <param name="List">DataGridView中选中行的索引的集合</param>
/// <param name="dgv">用来指示DataGridView</param>
public HandleExcel(List<Int32> List, DataGridView dgv)
{
this.List = List;
this.dgv = dgv;
}
//存相关的信息
private List<Attendance> listAttendance = new List<Attendance>();

#endregion

#region 导出excel
/// <summary>
/// 导出excel的方法
/// </summary>
public void ManageExportExcel()
{
// 实例化一个excel对象
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
//增加一张workbook
excel.SheetsInNewWorkbook = 1;
excel.Workbooks.Add();
try
{
//设置excel的列名。这里用循环得到所有的DataGridView中的列头的值,
//因为DataGridView中的第一列是checkbox,所以就下标开始设置就是1
//列的总数-1 是因为最后一个列不想展示。
for (int i = 1; i < dgv.Columns.Count - 1; i++)
{
excel.Cells[1, i] = dgv.Columns[i].HeaderCell.Value.ToString();
}
//设置单元格的格式
Range range = excel.get_Range(excel.Cells[1, 1], excel.Cells[dgv.Columns.Count - 2]);
//设置字体加粗
range.Font.Bold = true;
//设置背景颜色,字体和背景的设置和平常的From设置是类似的
range.Interior.ColorIndex = 15;
//设置边框样式
range.Borders.LineStyle = XlLineStyle.xlContinuous;


//将DataGridView的数据写入到excel中
//遍历所有的行
int j = 0, k = 0;//声明一个J,i 这个在下面设置单元格,格式后用到
for (k = 0; k < List.Count; k++)//遍历LIST数组,获取导出数据的行数
{
//遍历每行的所有的列
//因为DataGridView的第一列(第0列)是checkbox
//所以就不要了
for (j = 1; j < dgv.Columns.Count - 1; j++)//遍历DataGridView的列数,获取导出数据的列数
{
//前面已经设计了excel的第一行(列头)
//所以要从第2行开始
excel.Cells[k + 2, j] = dgv.Rows[List[k]].Cells[j].Value.ToString();
}
}
//设置单元格的数据显示模式为字符串
excel.get_Range(excel.Cells[2, 2], excel.Cells[k, j]).NumberFormatLocal = "@";
//设置单元格的水平对齐方式
excel.get_Range(excel.Cells[1, 1], excel.Cells[k + 1, j]).HorizontalAlignment = XlHAlign.xlHAlignCenter;
//设置列宽。
excel.get_Range(excel.Cells[1, 1], excel.Cells[1, j]).ColumnWidth = 10;
//显示这个excel,这里它不是一个保存好的文件,
//只是把它显示出来,需要手动保存。
excel.Visible = true;
}
catch (Exception e)
{
MessageBox.Show(e.ToString(), "异常信息");
}
}
#endregion

#region 导入excel
/// <summary>
/// 导入excel的方法
/// </summary>
public void ImportExcelManage()
{
//创建一个excel
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
//打开excel文件
excel.Workbooks.Open(this.filePath);
//声明一个工作簿
Worksheet sheet = null;
try
{
//遍历打开的文件中的所有的工作表
foreach (Worksheet wSheet in excel.ActiveWorkbook.Sheets)
{
if (wSheet.Name == this.sheetName)//判断名字
{
sheet = wSheet;//复制给新的工作簿
break;
}
}
//读取数据

if (sheet != null)
{

for (int row = 2; row < sheet.Rows.Count; row++)
{
// 获取excel中的数据
Range rangeMonth = sheet.Cells[row, 1] as Range;//考勤时间
Range rangestaffID = sheet.Cells[row, 2] as Range;//员工的ID
Range rangAbsenceTime = sheet.Cells[row, 4] as Range;//缺勤的次数
//判断是否有数据,如果没有就不继续读取了
if (rangeMonth.Text.ToString().Trim().Length == 0 || rangestaffID.Text.ToString().Trim().Length == 0)
{
break;
}
Attendance att = new Attendance();
att.MonthTime = rangeMonth.Text.ToString();
att.StaffID = Convert.ToInt32(rangestaffID.Text);
att.AbsenceTime = Convert.ToInt32(rangAbsenceTime.Text);
this.listAttendance.Add(att);
}
UpdatePayHistory();
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString(), "异常信息");
}
finally
{
//关闭excel 进程
//IntPtr 为句柄对象,句柄是Windows 编程的基础,
//标识应用程序中不同对象和同类对象中的不同实例,如一个窗口,一个按钮
//通过Hwnd 获取当前Excel Application 对象的句柄
IntPtr t = new IntPtr(excel.Hwnd);
int k = 0;
//调用方法获取进程ID
GetWindowThreadProcessId(t, out k);
//由进程ID获取进程
System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k);
p.Kill();//关闭进程
}
}
#endregion
}

操作excel的时候需要先添加引用

然后在程序中添加Using引用。

而要使用window的类库,也需要添加一个Using引用。

excel操作中有可能出现一下错误

这个错误的引发原因,大多是因为在操作excel的时候行标或者列标错误引起的。

出现的的时候可以先对行标列标进行检查.

 

注:这种方法操作excel 会因为excel版本的问题。导致别的版本的excel运行无效果。

解决的方法是

把excel当成数据库

另外excel实际上就可以当成文本输出,就是扩展名是xls,excel就可以把他当成xls文件。

 

posted @ 2012-03-15 12:59  Sky.Grain  阅读(357)  评论(0编辑  收藏  举报