C# 操作Excel

来源:互联网 发布:暗黑3mac版下载 编辑:程序博客网 时间:2024/06/07 02:57

[置顶]2中读取Excel方法

--------------------------------------------------------------------方法一

[html] view plaincopyprint?
  1. /// <summary>
  2. /// 解析Excel,返回DataTable
  3. /// </summary>
  4. /// <paramname="fileName"></param>
  5. /// <returns></returns>
  6. public static System.Data.DataTable ImpExcel(string fileName)
  7. {
  8. System.Data.DataTable dt = new System.Data.DataTable();
  9. try
  10. {
  11. Microsoft.Office.Interop.Excel.Application app;
  12. Workbooks wbs;
  13. Worksheet ws;
  14. app = new Microsoft.Office.Interop.Excel.Application();
  15. wbs = app.Workbooks;
  16. wbs.Add(fileName);
  17. ws = (Worksheet)app.Worksheets.get_Item(1);
  18. int a = ws.Rows.Count;
  19. int b = ws.Columns.Count;
  20. string name = ws.Name;
  21. for (int i = 1; i<RowCount; i++)
  22. {
  23. DataRow dr = dt.NewRow();
  24. for (int j = 1; j <= ColumnsCount; j++)
  25. {
  26. Range range = ws.get_Range(app.Cells[i, j], app.Cells[i, j]);
  27. range.Select();
  28. dr[j - 1] = app.ActiveCell.Text.ToString();
  29. }
  30. dt.Rows.Add(dr);
  31. }
  32. KillProcess(app);
  33. return dt;
  34. }
  35. catch (Exception ex)
  36. {
  37. MessageBox.Show("数据绑定Excel失败! 失败原因:Excel格式不正确!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
  38. return dt;
  39. }
  40. }
  41. <SPANstyle="COLOR: #ff0000">-------------------------------------------<SPANstyle="FONT-SIZE: 24px">方法二</SPAN></SPAN>
  42. /// <summary>
  43. /// 解析Excel,根据OleDbConnection直接连Excel
  44. /// </summary>
  45. /// <paramname="filePath"></param>
  46. /// <paramname="name"></param>
  47. /// <returns></returns>
  48. public static DataSet LoadDataFromExcel(string filePath, string name)
  49. {
  50. try
  51. {
  52. string strConn;
  53. // strConn = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = " + filePath + ";ExtendedProperties=Excel 8.0";
  54. strConn = @"Provider=Microsoft.ACE.OLEDB.12.0;DataSource=" + filePath + ";ExtendedProperties=\"Excel 12.0 Xml;HDR=No\"";
  55. OleDbConnection OleConn = new OleDbConnection(strConn);
  56. OleConn.Open();
  57. string sql = "SELECT * FROM [" + name + "$]";//可是更改Sheet名称,比如sheet2,等等
  58. OleDbDataAdapter OleDaExcel =new OleDbDataAdapter(sql, OleConn);
  59. DataSet OleDsExcle = new DataSet();
  60. OleDaExcel.Fill(OleDsExcle, name);
  61. OleConn.Close();
  62. return OleDsExcle;
  63. }
  64. catch (Exception err)
  65. {
  66. MessageBox.Show("数据绑定Excel失败! 失败原因:" + err.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
  67. return null;
  68. }
  69. }


——————————————————插入Excel

[csharp] view plaincopyprint?
  1. /// <summary>
  2. /// 写入Excel文档
  3. /// </summary>
  4. /// <param name="Path">文件名称</param>
  5. public bool SaveFP2toExcel(string Path)
  6. {
  7. try
  8. {
  9. string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source="+ Path +";"+"Extended Properties=Excel 8.0;";
  10. OleDbConnection conn = new OleDbConnection(strConn);
  11. conn.Open();
  12. System.Data.OleDb.OleDbCommand cmd=new OleDbCommand ();
  13. cmd.Connection =conn;
  14. for(int i=0;i<fp2.Sheets [0].RowCount -1;i++)
  15. {
  16. if(fp2.Sheets [0].Cells[i,0].Text!="")
  17. {
  18. cmd.CommandText ="INSERT INTO [sheet1$] (工号,姓名,部门,职务,日期,时间) VALUES('"+fp2.Sheets [0].Cells[i,0].Text+"','"+
  19. fp2.Sheets [0].Cells[i,1].Text+"','"+fp2.Sheets [0].Cells[i,2].Text+"','"+fp2.Sheets [0].Cells[i,3].Text+
  20. "','"+fp2.Sheets [0].Cells[i,4].Text+"','"+fp2.Sheets [0].Cells[i,5].Text+"')";
  21. cmd.ExecuteNonQuery ();
  22. }
  23. }
  24. conn.Close ();
  25. return true;
  26. }
  27. catch(System.Data.OleDb.OleDbException ex)
  28. {
  29. System.Diagnostics.Debug.WriteLine ("写入Excel发生错误:"+ex.Message );
  30. }
  31. return false;
  32. }


新增、修改

[csharp] view plaincopyprint?
  1. string path="你的excel的路径";
  2. workbook book=new workbook(path);
  3. worksheet sheet=book["sheet3"];
  4. sheet[行,列]=“你想存的值";
  5. workbook.saveas(newpath);



——————————————————修改Excel的值

[csharp] view plaincopyprint?
  1. 修改第一行Name的值为张三
  2. string strComm = "update [Sheet1$] set Name='张三' WHERE 工号='132'";
  3. OleDbConnection myConn = new OleDbConnection(strConn);
  4. myConn.Open();
  5. OleDbCommand com = new OleDbCommand(strComm, myConn);
  6. com.ExecuteNonQuery();
  7. myConn.Close();

------------------------------------------------导出————————————————————

[csharp] view plaincopyprint?
  1. using _Excel = Microsoft.Office.Interop.Excel;
  2. using System.Drawing;
  3. using System.Reflection;
  4. using System.Windows.Forms;
  5. using Microsoft.Office.Interop.Excel;
  6. /// <summary>
  7. /// DataTable直接导出Excel,此方法会把DataTable的数据用Excel打开,再自己手动去保存到确切的位置
  8. /// </summary>
  9. /// <param name="dt">要导出Excel的DataTable</param>
  10. /// <returns></returns>
  11. public staticvoid ExportExcel(System.Data.DataTable table,string savePath, bool isExit)
  12. {
  13. if (!isExit)//保存路径是否存在
  14. File.Copy(System.Windows.Forms.Application.StartupPath + @"\Excel\Excel.xls", savePath);
  15. _Excel.Application app = new _Excel.ApplicationClass();
  16. if (app == null)
  17. {
  18. throw new Exception("Excel无法启动");
  19. }
  20. app.Visible = false;
  21. _Excel.Workbook book = app.Workbooks.Open(savePath, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing);
  22. _Excel.Worksheet sheet = (_Excel.Worksheet)book.ActiveSheet;
  23. for (int k = 1; k < ds.Tables[1].Rows.Count + 1; k++)
  24. {
  25. _Excel.Sheets xlSheets = book.Sheets as Sheets;
  26. // 添加 Sheet
  27. sheet = (Worksheet)xlSheets.Add(xlSheets[1], Type.Missing, Type.Missing, Type.Missing);
  28. }
  29. for (int j = 1; j < ds.Tables[1].Rows.Count + 1; j++)
  30. {
  31. _Excel.Range range = null;
  32. sheet = (_Excel.Worksheet)book.Sheets[j];
  33. if (!istrue)
  34. sheet.Name ="123";
  35. else
  36. sheet.Name = "345";
  37. range = sheet.get_Range("A1","C3");
  38. range.MergeCells = true;//合并,将1-3行和1-3列合并为一个单元格
  39. range.WrapText = true;//自动换行
  40. range.EntireRow.AutoFit();//行高根据内容自动调整
  41. sheet.get_Range("A1","C3").Borders[XlBordersIndex.xlEdgeBottom].LineStyle = BorderStyle.FixedSingle;//将1-3行和1-3列合并的单元格划下划线,根据[]内属性,可以设置文本上、下、左、右的的边框框
  42. sheet.get_Range("A1", "C3").Borders.LineStyle = BorderStyle.FixedSingle;//给整个合并的单元格加上边框
  43. sheet.get_Range("A1","C3").Font.Name = "Times New Roman";//设置字体.
  44. sheet.get_Range("A1", "C3").Font.Size = 22;//设置字体大小
  45. range.Font.Bold = true;//加粗
  46. range.RowHeight = 22;//调行高
  47. rang.Interior.Color = System.Drawing.Color.FromArgb(255, 204, 153).ToArgb();//加背景色
  48. range = sheet.get_Range(string.Format("D{0}", 1),string.Format("F{0}", 1));
  49. range.MergeCells = true;//合并,将3-5列合并为一个单元格
  50. range.HorizontalAlignment = XlHAlign.xlHAlignCenter;//合并后文本水平居中
  51. range.VerticalAlignment = XlVAlign.xlVAlignCenter;//合并后文本竖直居中
  52. 單個sheet里求和:
  53. Excel.Range range2 = sheet.get_Range("B25", Type.Missing);
  54. range2.Formula = "=SUM(B2:B24)";
  55. range2.Calculate();
  56. rang = (_Excel.Range)sheet.get_Range(string.Format("G{0}", 7),string.Format("G{0}", table.Rows.Count + 7));
  57. rang.NumberFormatLocal = "$#,##0.00";//设置单元格格式为货币格式
  58. 跨sheet求和:
  59. Excel.Worksheet wsheet1 = (Excel.Worksheet)excelSql.Worksheets.get_Item(1);
  60. Excel.Range range3 =wsheet1.get_Range("A23", Type.Missing);
  61. range3.Formula = "=Sheet3!B8+Sheet3!B12";
  62. range3.Calculate();
  63. sheet.Cells[1, 4] = ds.Tables[1].Rows[0]["FeightCode"].ToString();//给合并的列赋值
  64. //循环加载数据
  65. int startIndex = 0;
  66. for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
  67. {
  68. if (ds.Tables[1].Rows[j - 1]["BoxCode"].ToString() == ds.Tables[0].Rows[i]["BoxCode"].ToString())
  69. {
  70. range = sheet.get_Range("b" + (15 + startIndex) +"", "e" + (15 + startIndex) +"");
  71. range.MergeCells = true;
  72. sheet.Cells[15 + startIndex, 2] = ds.Tables[0].Rows[i]["TypeName"].ToString();
  73. range = (_Excel.Range)sheet.Cells[15 + startIndex, 2];
  74. range.HorizontalAlignment = XlHAlign.xlHAlignCenter;
  75. range.Font.Bold = true;
  76. range.RowHeight = 22;
  77. sheet.Cells[15 + startIndex, 6] = ds.Tables[0].Rows[i]["Qty"].ToString();
  78. range = (_Excel.Range)sheet.Cells[15 + startIndex, 6];
  79. range.HorizontalAlignment = XlHAlign.xlHAlignCenter;
  80. range.Font.Bold = true;
  81. range.RowHeight = 22;
  82. sheet.Cells[15 + startIndex, 7] = ds.Tables[0].Rows[i]["UnitPrice"].ToString();
  83. range = (_Excel.Range)sheet.Cells[15 + startIndex, 7];
  84. range.HorizontalAlignment = XlHAlign.xlHAlignCenter;
  85. range.Font.Bold = true;
  86. range.RowHeight = 22;
  87. sheet.Cells[15 + startIndex, 8] = ds.Tables[0].Rows[i]["Subtotal"].ToString();
  88. range = (_Excel.Range)sheet.Cells[15 + startIndex, 8];
  89. range.HorizontalAlignment = XlHAlign.xlHAlignCenter;
  90. range.Font.Bold = true;
  91. range.RowHeight = 22;
  92. Image image = Picture.ReadPicture(ds.Tables[0].Rows[row][col].ToString());
  93. range = sheet.get_Range(string.Format("A{0}", row * num + 29),string.Format("A{0}", row * num + 48));
  94. sheet.Shapes.AddPicture(ds.Tables[0].Rows[row][col].ToString(), Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoTrue, Convert.ToSingle(range.Left) + 15 + image.Width, Convert.ToSingle(range.Top) + 5, image.Width, image.Height); //导出图片
  95. range.EntireColumn.AutoFit();
  96. System.Windows.Forms.Application.DoEvents();
  97. startIndex++;
  98. }
  99. }
[csharp] view plaincopyprint?
  1. rang = sheet.get_Range("a" + (table.Rows.Count + 3) +"", "r" + (table.Rows.Count + 3) +"");
  2. rang.Font.Bold = true;
  3. rang.Interior.Color = System.Drawing.Color.FromArgb(255, 204, 153).ToArgb();//设置单元格背景颜色
[csharp] view plaincopyprint?
  1. sheet.Columns.AutoFit();
  2. sheet.Cells.EntireColumn.AutoFit();
  3. sheet.Columns.EntireColumn.AutoFit();//列宽自适应。
  4. // sheet.Cells.Borders.LineStyle =BorderStyle.Fixed3D;//设置边框
  5. sheet = null;
  6. book.Save();
  7. }
  8. book.Close(sheet, savePath, System.Type.Missing);
  9. app.Quit();
  10. app.DisplayAlerts=false; //保存Excel的时候,不弹出是否保存的窗口直接进行保存
  11. System.GC.Collect();
  12. KillProcess(app);
  13. /// <summary>
  14. /// 导出Excel后,杀死Excel进程
  15. /// </summary>
  16. /// <param name="app"></param>
  17. private staticvoid KillProcess(_Excel.Application app)
  18. {
  19. IntPtr t = new IntPtr(app.Hwnd);
  20. int k = 0;
  21. GetWindowThreadProcessId(t, out k);
  22. System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k);
  23. p.Kill();
  24. }
  25. [DllImport("User32.dll", CharSet = CharSet.Auto)]
  26. public staticextern int GetWindowThreadProcessId(IntPtr hwnd,out int ID);

C#导出写保护的Excel,设置某些区域可以编辑
对Excel操作时,由于使用权限的不同,可能对表格的操作权限也不一样。EXCEL提供了保护工作表以及允许编辑单元格功能。相应的在C#中就可以对Excel表格进行操作。
有两种方法可以实现:
第一种:
[csharp] view plaincopyprint?
  1. 主要用Protect()方法保护工作表,Worksheet.Protection.AllowEditRanges设置允许编辑的单元格。
  2. public void CreateExcel()
  3. {
  4. //创建一个Excel文件
  5. Microsoft.Office.Interop.Excel.Application myExcel = new Microsoft.Office.Interop.Excel.Application();
  6. Microsoft.Office.Interop.Excel.Workbook excelWorkbook = null;
  7. Microsoft.Office.Interop.Excel.Worksheet excelSheet = null;
  8. myExcel.Application.Workbooks.Add(true);
  9. //让Excel文件可见
  10. myExcel.Visible = true;
  11. myExcel.Cells[1, 4] = "普通报表";
  12. //逐行写入数据
  13. for (int i = 0; i < 11; i++)
  14. {
  15. for (int j = 0; j < 7; j++)
  16. {
  17. //以单引号开头,表示该单元格为纯文本
  18. myExcel.Cells[2 + i, 1 + j] = "'" + i;
  19. }
  20. }
  21. try
  22. {
  23. string excelTemp ="c:\\a.xls";
  24. //excelWorkbook = myExcel.Workbooks[1];
  25. excelWorkbook = myExcel.ActiveWorkbook;
  26. excelSheet = (Microsoft.Office.Interop.Excel.Worksheet)excelWorkbook.ActiveSheet;
  27. //设定允许操作的单元格
  28. Microsoft.Office.Interop.Excel.AllowEditRanges ranges = excelSheet.Protection.AllowEditRanges;
  29. ranges.Add("Information", myExcel.Application.get_Range("B2","B2"), Type.Missing);
  30. //保护工作表
  31. excelSheet.Protect("MyPassword", Type.Missing, Type.Missing, Type.Missing,
  32. Type.Missing, Type.Missing, Type.Missing, Type.Missing,
  33. Type.Missing, Type.Missing, Type.Missing, Type.Missing,
  34. Type.Missing, true, Type.Missing, Type.Missing);
  35. //Realease the com object
  36. System.Runtime.InteropServices.Marshal.ReleaseComObject(excelSheet);
  37. excelSheet = null;
  38. //Save the result to a temp path
  39. excelWorkbook.SaveAs(excelTemp, Excel.XlFileFormat.xlWorkbookNormal,null, null,false, false,
  40. Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing,
  41. Type.Missing, Type.Missing,Type.Missing,Type.Missing);
  42. }
  43. catch (Exception ex)
  44. {
  45. throw;
  46. }
  47. finally
  48. {
  49. if (excelWorkbook !=null)
  50. {
  51. System.Runtime.InteropServices.Marshal.ReleaseComObject(excelWorkbook);
  52. excelWorkbook = null;
  53. }
  54. if (myExcel != null)
  55. {
  56. myExcel.Workbooks.Close();
  57. myExcel.Quit();
  58. System.Runtime.InteropServices.Marshal.ReleaseComObject(myExcel);
  59. myExcel = null;
  60. }
  61. GC.Collect();
  62. }
  63. }
  64. PS:借用此方法我写了个循环来设定单元格保护,没想到一直在报HRESULT:0x800A03EC 的一个异常,郁闷。
  65. 经过一番折腾,发现 AllowEditRanges.Add方法的第一个参数名是不能够重复的,写循环的时候没注意。

第二种:
用locked属性,设置Locked = false 的区域就可编辑的区域

[csharp] view plaincopyprint?
  1. worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[10, 10]).Locked =false;
  2. //保护工作表
  3. worksheet.Protect("MyPassword", Type.Missing, Type.Missing, Type.Missing,
  4. Type.Missing, Type.Missing, Type.Missing, Type.Missing,
  5. Type.Missing, Type.Missing, Type.Missing, Type.Missing,
  6. Type.Missing, true, true,true);
  7. ///
  8. /// 在工作表中插入行,并调整其他行以留出空间
  9. ///
  10. ///
  11. 当前工作表
  12. ///
  13. 欲插入的行索引
  14. private void InsertRows(Excel.Worksheet sheet,int rowIndex)
  15. {
  16. range = (Excel.Range)sheet.Rows[rowIndex, missing];
  17. //object Range.Insert(object shift, object copyorigin);
  18. //shift: Variant类型,可选。指定单元格的调整方式。可以为下列 XlInsertShiftDirection 常量之一:
  19. //xlShiftToRight 或 xlShiftDown。如果省略该参数,Microsoft Excel 将根据区域形状确定调整方式。
  20. range.Insert(Excel.XlInsertShiftDirection.xlShiftDown, missing);
  21. }
  22. ///
  23. /// 在工作表中删除行
  24. ///
  25. ///
  26. 当前工作表
  27. ///
  28. 欲删除的行索引
  29. private void DeleteRows(Excel.Worksheet sheet,int rowIndex)
  30. {
  31. range = (Range)sheet.Rows[rowIndex, missing];
  32. range.Delete(Excel.XlDeleteShiftDirection.xlShiftUp);
  33. }
  34. ///
  35. /// 退出Excel,并且释放调用的COM资源
  36. ///
  37. private void Dispose()
  38. {
  39. book.Close(missing, missing, missing);
  40. app.Workbooks.Close();
  41. app.Quit();
  42. }



----------------------------NOPI导出Excel-------------------------------

改单元格样式点击打开链接

[csharp] view plaincopyprint?
  1. dll下载地址:<A href="http://download.csdn.net/detail/happy09li/4436160" target=_blank>点击打开链接</A>
  2. using NPOI;
  3. using NPOI.HPSF;
  4. using NPOI.HSSF;
  5. using NPOI.HSSF.UserModel;
  6. public staticvoid exportExcel(DataTable dtSource, string strFileName)
  7. {
  8. HSSFWorkbook workbook = new HSSFWorkbook();
  9. HSSFSheet sheet = workbook.CreateSheet();
  10. //填充表头
  11. HSSFRow dataRow = sheet.CreateRow(0);
  12. HSSFCellStyle headStyle = workbook.CreateCellStyle();
  13. headStyle.Alignment = CellHorizontalAlignment.CENTER;
  14. HSSFFont font = workbook.CreateFont();
  15. font.FontHeightInPoints = 20;
  16. font.Boldweight = 700;
  17. headStyle.SetFont(font);
  18. foreach (DataColumn columnin dtSource.Columns)
  19. {
  20. dataRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
  21. dataRow.GetCell(column.Ordinal).CellStyle = headStyle;
  22. // dataRow.GetCell(column.Ordinal).c
  23. //设置列宽
  24. //sheet.SetColumnWidth(column.Ordinal,column.Caption.Length*20);
  25. }
  26. //填充内容
  27. for (int i = 0; i < dtSource.Rows.Count; i++)
  28. {
  29. dataRow = sheet.CreateRow(i + 1);
  30. for (int j = 0; j < dtSource.Columns.Count; j++)
  31. {
  32. dataRow.CreateCell(j).SetCellValue(dtSource.Rows[i][j].ToString());
  33. }
  34. }</pre><pre name="code"class="csharp">for (int m = 0; m < dtData.Columns.Count - 1; m++)
  35. {
  36. for (int n = 0; n < dtData.Rows.Count - 1; n++)
  37. {
  38. if (sheet.GetRow(n).GetCell(m).ToString() == sheet.GetRow(n + 1).GetCell(m).ToString() && !string.IsNullOrEmpty(sheet.GetRow(n).GetCell(m).ToString()))
  39. {
  40. sheet.AddMergedRegion(new NPOI.HSSF.Util.Region(n, m, n + 1, m));
  41. }
  42. //else if (sheet.GetRow(n).GetCell(m).ToString() == sheet.GetRow(n).GetCell(m + 1).ToString())
  43. //{
  44. // sheet.AddMergedRegion(new Region(n, m, n, m + 1));
  45. //}
  46. }
  47. }
  48. //保存
  49. using (MemoryStream ms = new MemoryStream())
  50. {
  51. using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))
  52. {
  53. workbook.Write(fs);
  54. }
  55. }
  56. workbook.Dispose();
  57. }
原创粉丝点击