using Microsoft.Office.Interop.Excel;
using System;
using System.Collections.Generic;
using System.ComponentModel;
namespace EXCEL
{
/// <summary>
/// 最后一定要记得close
/// </summary>
public class ExcelEditHelper
{
public string mFilename;
public Application app;
public Workbooks wbs;
public Workbook wb;
public Worksheets wss;
public Worksheet ws;
/// <summary>
/// 创建一个Excel对象
/// </summary>
public void Create()
{
app = new Application();
wbs = app.Workbooks;
wb = wbs.Add(true);
}
/// <summary>
/// 打开一个Excel文件
/// </summary>
/// <param name="FileName">excel文件名,包括文件路径</param>
public void Open(string FileName)
{
object missing = System.Reflection.Missing.Value;
app = new Application();
wbs = app.Workbooks;
wb = wbs.Add(FileName);
wb = wbs.Open(FileName, missing, true, missing, missing, missing, missing, missing, missing, true, missing, missing, missing, missing, missing);
mFilename = FileName;
//取得第一个工作薄
ws = (Worksheet)wb.Worksheets.get_Item(1);
//取得总记录行数 (包括标题列)
int rowsint = ws.UsedRange.Cells.Rows.Count; //得到行数
int columnsint = ws.UsedRange.Cells.Columns.Count;//得到列数
//第一行第二列
string ss = ws.Cells[1, 2].Value2.ToString();
//取得数据范围区域 (不包括标题列 B2到Bn)
Range rng1 = ws.Cells.get_Range("B2", "B" + rowsint);
object[,] arryItem = (object[,])rng1.Value2; //get range's value
for (int i = 1; i <= rowsint - 1; i++)
{
string str = arryItem[i, 1].ToString();
}
}
/// <summary>
/// 获取一个工作表
/// </summary>
/// <param name="SheetName">工作表名称</param>
/// <returns></returns>
public Worksheet GetSheet(string SheetName)
{
Worksheet s = (Worksheet)wb.Worksheets[SheetName];
return s;
}
/// <summary>
/// 添加一个工作表
/// </summary>
/// <param name="SheetName">工作表名称</param>
/// <returns></returns>
public Worksheet AddSheet(string SheetName)
{
Worksheet s = (Worksheet)wb.Worksheets.Add(Type.Missing, Type.Missing, Type.Missing, Type.Missing);
s.Name = SheetName;
return s;
}
/// <summary>
/// 复制并添加一个工作表
/// </summary>
/// <param name="OldSheetName"> 被复制工作表</param>
/// <param name="NewSheetName">新表</param>
public void CloneSheet(string OldSheetName, string NewSheetName)
{
Microsoft.Office.Interop.Excel.Worksheet oldSheet = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets[OldSheetName];
oldSheet.Copy(oldSheet, Type.Missing);
Microsoft.Office.Interop.Excel.Worksheet s = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets[OldSheetName + " (2)"];
s.Name = NewSheetName;
}
/// <summary>
/// 删除一个工作表
/// </summary>
/// <param name="SheetName">工作表名称</param>
public void DelSheet(string SheetName)
{
((Worksheet)wb.Worksheets[SheetName]).Delete();
}
/// <summary>
/// 重命名一个工作表
/// </summary>
/// <param name="OldSheetName">被替换名称</param>
/// <param name="NewSheetName">替换名称</param>
/// <returns></returns>
public Worksheet ReNameSheet(string OldSheetName, string NewSheetName)
{
Worksheet s = (Worksheet)wb.Worksheets[OldSheetName];
s.Name = NewSheetName;
return s;
}
/// <summary>
/// 重命名一个工作表
/// </summary>
/// <param name="Sheet">被替换工作表</param>
/// <param name="NewSheetName">替换名称</param>
/// <returns></returns>
public Worksheet ReNameSheet(Worksheet Sheet, string NewSheetName)
{
Sheet.Name = NewSheetName;
return Sheet;
}
/// <summary>
/// 设置单元格的值
/// </summary>
/// <param name="ws">工作表</param>
/// <param name="x">行标</param>
/// <param name="y">列标</param>
/// <param name="value">数据</param>
public void SetCellValue(Worksheet ws, int x, int y, object value)
{
ws.Cells[x, y] = value;
}
/// <summary>
/// 设置单元格的值
/// </summary>
/// <param name="ws">工作表名称</param>
/// <param name="x">行标</param>
/// <param name="y">列标</param>
/// <param name="value">数据</param>
public void SetCellValue(string ws, int x, int y, object value)
{
GetSheet(ws).Cells[x, y] = value;
}
/// <summary>
/// 设置单元格属性
/// </summary>
/// <param name="ws">工作表</param>
/// <param name="Startx">起始行标</param>
/// <param name="Starty">起始列标</param>
/// <param name="Endx">终止行标</param>
/// <param name="Endy">终止列标</param>
/// <param name="size">字体大小</param>
/// <param name="name">字体</param>
/// <param name="color">颜色</param>
/// <param name="HorizontalAlignment">对齐方式</param>
public void SetCellProperty(Worksheet ws, int Startx, int Starty, int Endx, int Endy, int size, string name, Constants color, Constants HorizontalAlignment)
{
ws.get_Range(ws.Cells[Startx, Starty], ws.Cells[Endx, Endy]).Font.Name = name;
ws.get_Range(ws.Cells[Startx, Starty], ws.Cells[Endx, Endy]).Font.Size = size;
ws.get_Range(ws.Cells[Startx, Starty], ws.Cells[Endx, Endy]).Font.Color = color;
ws.get_Range(ws.Cells[Startx, Starty], ws.Cells[Endx, Endy]).HorizontalAlignment = HorizontalAlignment;
}
/// <summary>
/// 设置单元格属性
/// </summary>
/// <param name="ws">工作表名称</param>
/// <param name="Startx">起始行标</param>
/// <param name="Starty">起始列标</param>
/// <param name="Endx">终止行标</param>
/// <param name="Endy">终止列标</param>
/// <param name="size">字体大小</param>
/// <param name="name">字体</param>
/// <param name="color">颜色</param>
/// <param name="HorizontalAlignment">对齐方式</param>
public void SetCellProperty(string wsn, int Startx, int Starty, int Endx, int Endy, int size, string name, Constants color, Constants HorizontalAlignment)
{
Worksheet ws = GetSheet(wsn);
ws.get_Range(ws.Cells[Startx, Starty], ws.Cells[Endx, Endy]).Font.Name = name;
ws.get_Range(ws.Cells[Startx, Starty], ws.Cells[Endx, Endy]).Font.Size = size;
ws.get_Range(ws.Cells[Startx, Starty], ws.Cells[Endx, Endy]).Font.Color = color;
ws.get_Range(ws.Cells[Startx, Starty], ws.Cells[Endx, Endy]).HorizontalAlignment = HorizontalAlignment;
}
/// <summary>
/// 合并单元格
/// </summary>
/// <param name="ws">工作表</param>
/// <param name="x1">起始行标</param>
/// <param name="y1">起始列标</param>
/// <param name="x2">终止行标</param>
/// <param name="y2">终止列标</param>
public void UniteCells(Worksheet ws, int x1, int y1, int x2, int y2)
{
ws.get_Range(ws.Cells[x1, y1], ws.Cells[x2, y2]).Merge(Type.Missing);
}
/// <summary>
/// 合并单元格
/// </summary>
/// <param name="ws">工作表名称</param>
/// <param name="x1">起始行标</param>
/// <param name="y1">起始列标</param>
/// <param name="x2">终止行标</param>
/// <param name="y2">终止列标</param>
public void UniteCells(string ws, int x1, int y1, int x2, int y2)
{
GetSheet(ws).get_Range(GetSheet(ws).Cells[x1, y1], GetSheet(ws).Cells[x2, y2]).Merge(Type.Missing);
}
/// <summary>
/// 将内存中数据表格插入到Excel指定工作表的指定位置
/// </summary>
/// <param name="dt">数据表</param>
/// <param name="ws">工作表名称</param>
/// <param name="startX">起始行标</param>
/// <param name="startY">起始列标</param>
public void InsertTable(System.Data.DataTable dt, string ws, int startX, int startY)
{
int itm = 0;
foreach (var item in dt.Columns)
{
GetSheet(ws).Cells[startX, startY + itm] = item.ToString();
itm++;
}
for (int i = 0; i <= dt.Rows.Count - 1; i++)
{
for (int j = 0; j <= dt.Columns.Count - 1; j++)
{
GetSheet(ws).Cells[startX + i+1, j + startY] = dt.Rows[i][j];
}
}
}
/// <summary>
/// 将内存中数据表格插入到Excel指定工作表的指定位置
/// </summary>
/// <param name="dt">数据表</param>
/// <param name="ws">工作表名称</param>
/// <param name="startX">起始行标</param>
/// <param name="startY">起始列标</param>
public void InsertTable(System.Data.DataTable dt, Worksheet ws, int startX, int startY)
{
int itm = 0;
foreach (var item in dt.Columns)
{
ws.Cells[startX, startY + itm] = item.ToString();
itm++;
}
for (int i = 0; i <= dt.Rows.Count - 1; i++)
{
for (int j = 0; j <= dt.Columns.Count - 1; j++)
{
ws.Cells[startX + i+1, j + startY] = dt.Rows[i][j];
}
}
}
/// <summary>
/// 插入表头
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="ws">工作表名称</param>
public void InsertRowName<T>(string ws) where T : class
{
Dictionary<string, string> dic = Resolve<T>();
int itm = 0;
foreach (var item in dic)
{
GetSheet(ws).Cells[1, 1 + itm] = item.Value;
itm++;
}
}
//获取属性名称及显示名称
private static Dictionary<string, string> Resolve<T>()
{
Dictionary<string, string> dic = new Dictionary<string, string>();
var t = typeof(T);
foreach (var property in t.GetProperties())
{
//获取displayname(需在类属性上添加 [DisplayName("**")]特性)
DisplayNameAttribute[] x = property.GetCustomAttributes(typeof(DisplayNameAttribute), true) as DisplayNameAttribute[];
if (x != null && x.Length > 0)
{
if (!dic.ContainsKey(property.Name))
{
dic.Add(property.Name, x[0].DisplayName);
}
}
}
return dic;
}
/// <summary>
/// 保存文档
/// </summary>
/// <returns></returns>
public bool Save()
{
if (mFilename == "")
{
return false;
}
else
{
try
{
wb.Save();
return true;
}
catch (Exception ex)
{
return false;
}
}
}
/// <summary>
/// 文档另存为
/// </summary>
/// <param name="FileName">文件名(包含路径)</param>
/// <returns></returns>
public bool SaveAs(object FileName)
{
try
{
wb.SaveAs(FileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
return true;
}
catch (Exception ex)
{
return false;
}
}
/// <summary>
/// 关闭一个Excel对象,销毁对象
/// </summary>
public void Close()
{
wb.Close(Type.Missing, Type.Missing, Type.Missing);
wbs.Close();
app.Quit();
wb = null;
wbs = null;
app = null;
GC.Collect();
}
}
}