zoukankan      html  css  js  c++  java
  • [转]C# 导入导出Excel通用类(SamWang)

    http://www.cnblogs.com/wangshenhe/archive/2012/05/10/2493727.html
    1
    /****************************************************************** 2 * 创 建 人: SamWang 3 * 创建时间: 2012-3-16 9:59 4 * 描 述: 5 * 导入导出Excel通用类 6 * 版 本: V1.0 7 * 环 境: VS2005 8 ******************************************************************/ 9 using System; 10 using System.Collections.Generic; 11 using System.Text; 12 using System.Windows.Forms; 13 using Excel = Microsoft.Office.Interop.Excel; 14 using System.Data; 15 using System.Drawing; 16 using System.Collections; 17 using System.Diagnostics; 18 using System.Data.OleDb; 19 20 namespace LingDang.CRM.UI.Client 21 { 22 public class ExcelIO:IDisposable 23 { 24 #region Constructors 25 private ExcelIO() 26 { 27 status = IsExistExecl() ? 0 : -1; 28 } 29 30 public static ExcelIO GetInstance() 31 { 32 //if(instance == null) 33 //{ 34 // lock (syncRoot) 35 // { 36 // if(instance == null) 37 // { 38 // instance = new ExcelIO(); 39 // } 40 // } 41 //} 42 //return instance; 43 return new ExcelIO(); 44 } 45 #endregion 46 47 #region Fields 48 private static ExcelIO instance; 49 private static readonly object syncRoot = new object(); 50 private string returnMessage; 51 private Excel.Application xlApp; 52 private Excel.Workbooks workbooks = null; 53 private Excel.Workbook workbook = null; 54 private Excel.Worksheet worksheet = null; 55 private Excel.Range range = null; 56 private int status = -1; 57 private bool disposed = false;//是否已经释放资源的标记 58 #endregion 59 60 #region Properties 61 /// <summary> 62 /// 返回信息 63 /// </summary> 64 public string ReturnMessage 65 { 66 get { return returnMessage; } 67 } 68 69 /// <summary> 70 /// 状态:0-正常,-1-失败 1-成功 71 /// </summary> 72 public int Status 73 { 74 get { return status;} 75 } 76 #endregion 77 78 #region Methods 79 /// <summary> 80 /// 判断是否安装Excel 81 /// </summary> 82 /// <returns></returns> 83 protected bool IsExistExecl() 84 { 85 try 86 { 87 xlApp = new Excel.Application(); 88 if (xlApp == null) 89 { 90 returnMessage = "无法创建Excel对象,可能您的计算机未安装Excel!"; 91 return false; 92 } 93 } 94 catch (Exception ex) 95 { 96 returnMessage = "请正确安装Excel!"; 97 //throw ex; 98 return false; 99 } 100 101 return true; 102 } 103 104 /// <summary> 105 /// 获得保存路径 106 /// </summary> 107 /// <returns></returns> 108 public static string SaveFileDialog() 109 { 110 SaveFileDialog sfd = new SaveFileDialog(); 111 sfd.DefaultExt = "xls"; 112 sfd.Filter = "Excel文件(*.xls)|*.xls"; 113 if (sfd.ShowDialog() == DialogResult.OK) 114 { 115 return sfd.FileName; 116 } 117 return string.Empty; 118 } 119 120 /// <summary> 121 /// 获得打开文件的路径 122 /// </summary> 123 /// <returns></returns> 124 public static string OpenFileDialog() 125 { 126 OpenFileDialog ofd = new OpenFileDialog(); 127 ofd.DefaultExt = "xls"; 128 ofd.Filter = "Excel文件(*.xls)|*.xls"; 129 if (ofd.ShowDialog() == DialogResult.OK) 130 { 131 return ofd.FileName; 132 } 133 return string.Empty; 134 } 135 136 /// <summary> 137 /// 设置单元格边框 138 /// </summary> 139 protected void SetCellsBorderAround() 140 { 141 range.BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThin, Excel.XlColorIndex.xlColorIndexAutomatic, null); 142 //if (dt.Rows.Count > 0) 143 //{ 144 // range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].ColorIndex = Excel.XlColorIndex.xlColorIndexAutomatic; 145 // range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].LineStyle = Excel.XlLineStyle.xlContinuous; 146 // range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].Weight = Excel.XlBorderWeight.xlThin; 147 //} 148 //if (dt.Columns.Count > 1) 149 { 150 range.Borders[Excel.XlBordersIndex.xlInsideVertical].ColorIndex = Excel.XlColorIndex.xlColorIndexAutomatic; 151 range.Borders[Excel.XlBordersIndex.xlInsideVertical].LineStyle = Excel.XlLineStyle.xlContinuous; 152 range.Borders[Excel.XlBordersIndex.xlInsideVertical].Weight = Excel.XlBorderWeight.xlThin; 153 } 154 } 155 156 /// <summary> 157 /// 将DataTable导出Excel 158 /// </summary> 159 /// <param name="dt">数据集</param> 160 /// <param name="saveFilePath">保存路径</param> 161 /// <param name="reportName">报表名称</param> 162 /// <returns>是否成功</returns> 163 public bool DataTableToExecl(DataTable dt, string saveFileName, string reportName) 164 { 165 //判断是否安装Excel 166 bool fileSaved = false; 167 if(status == -1) return fileSaved; 168 //判断数据集是否为null 169 if (dt == null) 170 { 171 returnMessage = "无引出数据!"; 172 return false; 173 } 174 //判断保存路径是否有效 175 if (!saveFileName.Contains(":")) 176 { 177 returnMessage = "引出路径有误!请选择正确路径!"; 178 return false; 179 } 180 181 //创建excel对象 182 workbooks = xlApp.Workbooks; 183 workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet); 184 worksheet = (Excel.Worksheet)workbook.Worksheets[1];//取得sheet1 185 worksheet.Cells.Font.Size = 10; 186 worksheet.Cells.NumberFormat = "@"; 187 long totalCount = dt.Rows.Count; 188 long rowRead = 0; 189 float percent = 0; 190 int rowIndex = 0; 191 192 //第一行为报表名称,如果为null则不保存该行 193 ++rowIndex; 194 worksheet.Cells[rowIndex, 1] = reportName; 195 range = (Excel.Range)worksheet.Cells[rowIndex, 1]; 196 range.Font.Bold = true; 197 198 //写入字段(标题) 199 ++rowIndex; 200 for (int i = 0; i < dt.Columns.Count; i++) 201 { 202 worksheet.Cells[rowIndex,i+1] = dt.Columns[i].ColumnName; 203 range = (Excel.Range)worksheet.Cells[rowIndex, i + 1]; 204 205 range.Font.Color = ColorTranslator.ToOle(Color.Blue); 206 range.Interior.Color = dt.Columns[i].Caption == "表体" ? ColorTranslator.ToOle(Color.SkyBlue) : ColorTranslator.ToOle(Color.Yellow); 207 } 208 209 //写入数据 210 ++rowIndex; 211 for (int r = 0; r < dt.Rows.Count; r++) 212 { 213 for (int i = 0; i < dt.Columns.Count; i++) 214 { 215 worksheet.Cells[r + rowIndex, i + 1] = dt.Rows[r][i].ToString(); 216 } 217 rowRead++; 218 percent = ((float)(100 * rowRead)) / totalCount; 219 } 220 221 //画单元格边框 222 range = worksheet.get_Range(worksheet.Cells[2, 1], worksheet.Cells[dt.Rows.Count + 2, dt.Columns.Count]); 223 this.SetCellsBorderAround(); 224 225 //列宽自适应 226 range.EntireColumn.AutoFit(); 227 228 //保存文件 229 if (saveFileName != "") 230 { 231 try 232 { 233 workbook.Saved = true; 234 workbook.SaveCopyAs(saveFileName); 235 fileSaved = true; 236 } 237 catch (Exception ex) 238 { 239 fileSaved = false; 240 returnMessage = "导出文件时出错,文件可能正被打开!\n" + ex.Message; 241 } 242 } 243 else 244 { 245 fileSaved = false; 246 } 247 248 //释放Excel对应的对象(除xlApp,因为创建xlApp很花时间,所以等析构时才删除) 249 //Dispose(false); 250 Dispose(); 251 return fileSaved; 252 } 253 254 /// <summary> 255 /// 导入EXCEL到DataSet 256 /// </summary> 257 /// <param name="fileName">Excel全路径文件名</param> 258 /// <returns>导入成功的DataSet</returns> 259 public DataSet ImportExcel(string fileName) 260 { 261 if (status == -1) return null; 262 //判断文件是否被其他进程使用 263 try 264 { 265 workbook = xlApp.Workbooks.Open(fileName, 0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "", true, false, 0, true, 1, 0); 266 worksheet = (Excel.Worksheet)workbook.Worksheets[1]; 267 } 268 catch 269 { 270 returnMessage = "Excel文件处于打开状态,请保存关闭"; 271 return null; 272 } 273 274 //获得所有Sheet名称 275 int n = workbook.Worksheets.Count; 276 string[] sheetSet = new string[n]; 277 ArrayList al = new ArrayList(); 278 for (int i = 0; i < n; i++) 279 { 280 sheetSet[i] = ((Excel.Worksheet)workbook.Worksheets[i+1]).Name; 281 } 282 283 //释放Excel相关对象 284 Dispose(); 285 286 //把EXCEL导入到DataSet 287 DataSet ds = null; 288 //string connStr = " Provider = Microsoft.ACE.OLEDB.12.0 ; Data Source = " + fileName + ";Extended Properties=\"Excel 12.0;HDR=No;IMEX=1;\""; 289 List<string> connStrs = new List<string>(); 290 connStrs.Add("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = " + fileName + ";Extended Properties=\"Excel 8.0;HDR=No;IMEX=1;\""); 291 connStrs.Add("Provider = Microsoft.ACE.OLEDB.12.0 ; Data Source = " + fileName + ";Extended Properties=\"Excel 12.0;HDR=No;IMEX=1;\""); 292 foreach (string connStr in connStrs) 293 { 294 ds = GetDataSet(connStr, sheetSet); 295 if (ds != null) break; 296 } 297 return ds; 298 } 299 300 /// <summary> 301 /// 通过olddb获得dataset 302 /// </summary> 303 /// <param name="connectionstring"></param> 304 /// <returns></returns> 305 protected DataSet GetDataSet(string connStr, string[] sheetSet) 306 { 307 DataSet ds = null; 308 using (OleDbConnection conn = new OleDbConnection(connStr)) 309 { 310 try 311 { 312 conn.Open(); 313 OleDbDataAdapter da; 314 ds = new DataSet(); 315 for (int i = 0; i < sheetSet.Length; i++) 316 { 317 string sql = "select * from [" + sheetSet[i] + "$] "; 318 da = new OleDbDataAdapter(sql, conn); 319 da.Fill(ds, sheetSet[i]); 320 da.Dispose(); 321 } 322 conn.Close(); 323 conn.Dispose(); 324 } 325 catch (Exception ex) 326 { 327 return null; 328 } 329 } 330 return ds; 331 } 332 333 /// <summary> 334 /// 释放Excel对应的对象资源 335 /// </summary> 336 /// <param name="isDisposeAll"></param> 337 protected virtual void Dispose(bool disposing) 338 { 339 try 340 { 341 if (!disposed) 342 { 343 if (disposing) 344 { 345 if (range != null) 346 { 347 System.Runtime.InteropServices.Marshal.ReleaseComObject(range); 348 range = null; 349 } 350 if (worksheet != null) 351 { 352 System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet); 353 worksheet = null; 354 } 355 if (workbook != null) 356 { 357 System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook); 358 workbook = null; 359 } 360 if (workbooks != null) 361 { 362 xlApp.Application.Workbooks.Close(); 363 System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks); 364 workbooks = null; 365 } 366 if (xlApp != null) 367 { 368 xlApp.Quit(); 369 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp); 370 } 371 int generation = GC.GetGeneration(xlApp); 372 System.GC.Collect(generation); 373 } 374 375 //非托管资源的释放 376 //KillExcel(); 377 } 378 disposed = true; 379 } 380 catch (Exception e) 381 { 382 throw e; 383 } 384 } 385 386 /// <summary> 387 /// 会自动释放非托管的该类实例的相关资源 388 /// </summary> 389 public void Dispose() 390 { 391 try 392 { 393 Dispose(true); 394 //告诉垃圾回收器,资源已经被回收 395 GC.SuppressFinalize(this); 396 } 397 catch (Exception e) 398 { 399 throw e; 400 } 401 } 402 403 /// <summary> 404 /// 关闭 405 /// </summary> 406 public void Close() 407 { 408 try 409 { 410 this.Dispose(); 411 } 412 catch (Exception e) 413 { 414 415 throw e; 416 } 417 } 418 419 /// <summary> 420 /// 析构函数 421 /// </summary> 422 ~ExcelIO() 423 { 424 try 425 { 426 Dispose(false); 427 } 428 catch (Exception e) 429 { 430 throw e; 431 } 432 } 433 434 /// <summary> 435 /// 关闭Execl进程(非托管资源使用) 436 /// </summary> 437 private void KillExcel() 438 { 439 try 440 { 441 Process[] ps = Process.GetProcesses(); 442 foreach (Process p in ps) 443 { 444 if (p.ProcessName.ToLower().Equals("excel")) 445 { 446 //if (p.Id == ExcelID) 447 { 448 p.Kill(); 449 } 450 } 451 } 452 } 453 catch (Exception ex) 454 { 455 //MessageBox.Show("ERROR " + ex.Message); 456 } 457 } 458 459 #endregion 460 461 #region Events 462 463 #endregion 464 465 466 #region IDisposable 成员 467 468 469 #endregion 470 } 471 }
    复制代码
  • 相关阅读:
    分层图最短路(DP思想) BZOJ2662 [BeiJing wc2012]冻结
    动态规划 BZOJ1925 地精部落
    线性DP SPOJ Mobile Service
    线性DP codevs2185 最长公共上升子序列
    数位DP POJ3208 Apocalypse Someday
    线性DP POJ3666 Making the Grade
    杨氏矩阵 线性DP? POJ2279 Mr.Young's Picture Permutations
    tarjan强连通分量 洛谷P1262 间谍网络
    树链剖分 BZOJ3589 动态树
    二分图 BZOJ4554 [Tjoi2016&Heoi2016]游戏
  • 原文地址:https://www.cnblogs.com/oneLight/p/2499678.html
Copyright © 2011-2022 走看看