1 using System;
2 using System;
3 using System.Collections.Generic;
4 using System.Linq;
5 using System.Text;
6 using Excel = Microsoft.Office.Interop.Excel;
7 using System.Collections;
8 using System.Data;
9 using System.Runtime.InteropServices;
10 using System.Reflection;
11
12 namespace BeiJing.ISS.Common
13 {
14 public class Table_ToExcel
15 {
16 public Excel.Application m_xlApp = null;
17
18 #region 外部接口
19 /// <summary>
20 /// 将一个DataTable的数据导出多个Excel文件(每一个Excel文件的数据行数由函数控制)
21
22 /// </summary>
23 /// <param name="tempDataTable">数据源</param>
24 /// <param name="PathFileName">保存excel的路径</param>
25 /// <param name="ExcelRows">每一个Excel文件的行数</param>
26 /// <param name="ExcelVersion">导出Excel的版本(2003,2007)</param>
27 public void u_DataTableToExcel1(DataTable tempDataTable, string filepath, string filename, long ExcelRows, string ExcelVersion)
28 {
29 if (tempDataTable == null)
30 {
31 return;
32 }
33 long rowNum = tempDataTable.Rows.Count;//导出数据的行数
34 int columnNum = tempDataTable.Columns.Count;//导出数据的列数
35 string sFileName = "";
36 if (rowNum > ExcelRows)
37 {
38 long excelRows = ExcelRows;//定义个excel文件显示的行数,最大的行数为65535,不能超过65535
39 int scount = (int)(rowNum / excelRows);//生成excel文件的个数
40 if (scount * excelRows < rowNum)//当总行数不被excelRows整除时,经过四舍五入可能excel的个数不准
41 {
42 scount = scount + 1;
43 }
44 for (int sc = 1; sc <= scount; sc++)
45 {
46 int init = int.Parse(((sc - 1) * excelRows).ToString());
47 sFileName = filepath + sc.ToString();
48 long start = init;
49 long end = sc * excelRows - 1;
50 if (sc == scount)
51 end = rowNum - 1;
52 u_OutExcel(tempDataTable, start, end, filepath, filename, ExcelVersion);
53 }
54 }
55 else
56 {
57 u_OutExcel(tempDataTable, 0, rowNum - 1, filepath, filename, ExcelVersion);
58 }
59 tempDataTable = null;
60 }
61 /// <summary>
62 /// 将一个DataTable的数据导出一个Excel文件:可能包含多个sheet文件,由sheet行数决定 (每一个sheet文件的行数由函数控制)
63 /// </summary>
64 /// <param name="tempDataTable">数据源</param>
65 /// <param name="PathFileName">导出excel的路径</param>
66 /// <param name="SheetRows">excel的文件中sheet的行数</param>
67 /// <param name="ExcelVersion">导出Excel的版本</param>
68 public void u_DataTableToExcel2(DataTable tempDataTable, string Path, string FileName, long SheetRows, string ExcelVersion, bool BudgetStatistics=false)
69 {
70 if (tempDataTable == null)
71 {
72 return;
73 }
74 long rowNum = tempDataTable.Rows.Count;//行数
75 int columnNum = tempDataTable.Columns.Count;//列数
76 Excel.Application m_xlApp = new Excel.Application();
77 m_xlApp.DisplayAlerts = false;//不显示更改提示
78 m_xlApp.Visible = false;
79 m_xlApp.UserControl = true;
80 m_xlApp.EnableLargeOperationAlert = false;
81 m_xlApp.EnableLivePreview = false;
82
83 Excel.Workbooks workbooks = m_xlApp.Workbooks;
84 Excel.Workbook workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
85 Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets[1];//取得sheet1
86 try
87 {
88 if (rowNum > SheetRows)//单张Sheet表格最大行数
89 {
90 long sheetRows = SheetRows;//定义每页显示的行数,行数必须小于65536
91 int scount = (int)(rowNum / sheetRows);//导出数据生成的表单数
92 if (scount * sheetRows < rowNum)//当总行数不被sheetRows整除时,经过四舍五入可能页数不准
93 {
94 scount = scount + 1;
95 }
96 for (int sc = 1; sc <= scount; sc++)
97 {
98 if (sc > 1)
99 {
100 object missing = System.Reflection.Missing.Value;
101 worksheet = (Excel.Worksheet)workbook.Worksheets.Add(missing, missing, missing, missing);//添加一个sheet
102 }
103 else
104 {
105 worksheet = (Excel.Worksheet)workbook.Worksheets[sc];//取得sheet1
106 }
107 string[,] datas = new string[sheetRows + 1, columnNum];
108
109 for (int i = 0; i < columnNum; i++) //写入字段
110 {
111 datas[0, i] = tempDataTable.Columns[i].Caption;//表头信息
112 }
113 Excel.Range range = worksheet.Range[worksheet.Cells[1, 1], worksheet.Cells[1, columnNum]];
114 range.Interior.ColorIndex = 15;//15代表灰色
115 range.Font.Bold = true;
116 range.Font.Size = 9;
117 int init = int.Parse(((sc - 1) * sheetRows).ToString());
118 int r = 0;
119 int index = 0;
120 int result;
121 if (sheetRows * sc >= rowNum)
122 {
123 result = (int)rowNum;
124 }
125 else
126 {
127 result = int.Parse((sheetRows * sc).ToString());
128 }
129 for (r = init; r < result; r++)
130 {
131 index = index + 1;
132 for (int i = 0; i < columnNum; i++)
133 {
134 object obj = tempDataTable.Rows[r][tempDataTable.Columns[i].ToString()];
135 datas[index, i] = obj == null ? "" : "'" + obj.ToString().Trim();//在obj.ToString()前加单引号是为了防止自动转化格式
136 }
137 }
138 Excel.Range fchR = worksheet.Range[worksheet.Cells[1, 1], worksheet.Cells[index + 1, columnNum]];
139 fchR.Value2 = datas;
140 worksheet.Columns.EntireColumn.AutoFit();//列宽自适应。
141 m_xlApp.WindowState = Excel.XlWindowState.xlMaximized;//Sheet表最大化
142 range = worksheet.Range[worksheet.Cells[1, 1], worksheet.Cells[index + 1, columnNum]];
143 //range.Interior.ColorIndex = 15;//15代表灰色
144 range.Font.Size = 9;
145 range.RowHeight = 14.25;
146 range.Borders.LineStyle = 1;
147 range.HorizontalAlignment = 1;
148 }
149 }
150 else
151 {
152 string[,] datas = new string[rowNum + 1, columnNum];
153 for (int i = 0; i < columnNum; i++) //写入字段
154 {
155 datas[0, i] = tempDataTable.Columns[i].Caption;
156 }
157 Excel.Range range = worksheet.Range[worksheet.Cells[1, 1], worksheet.Cells[1, columnNum]];
158 range.Interior.ColorIndex = 15;//15代表灰色
159 range.Font.Bold = true;
160 range.Font.Size = 9;
161 int r = 0;
162 for (r = 0; r < rowNum; r++)
163 {
164 if (BudgetStatistics && r == rowNum - 1)//预算表统计导出 最后一行
165 {
166 for (int i = 0; i < columnNum; i++)
167 {
168 if (i == 0)
169 {
170 datas[r + 1, i] = "'总计:";
171 }
172 else
173 {
174 object obj = tempDataTable.Rows[r][tempDataTable.Columns[i].ToString()];
175 if (obj==null || obj == DBNull.Value)
176 {
177 //obj = "0.00";
178 }
179 datas[r + 1, i] = obj == null ? "" : "'" + obj.ToString().Trim();//在obj.ToString()前加单引号是为了防止自动转化格式
180 }
181 }
182 }
183 else
184 {
185 for (int i = 0; i < columnNum; i++)
186 {
187 object obj = tempDataTable.Rows[r][tempDataTable.Columns[i].ToString()];
188 datas[r + 1, i] = obj == null ? "" : "'" + obj.ToString().Trim();//在obj.ToString()前加单引号是为了防止自动转化格式
189 }
190 }
191 }
192 Excel.Range fchR = worksheet.Range[worksheet.Cells[1, 1], worksheet.Cells[rowNum + 1, columnNum]];
193 fchR.Value2 = datas;
194 worksheet.Columns.EntireColumn.AutoFit();//列宽自适应。
195 m_xlApp.WindowState = Excel.XlWindowState.xlMaximized;
196 range = worksheet.Range[worksheet.Cells[1, 1], worksheet.Cells[rowNum + 1, columnNum]];
197 //range.Interior.ColorIndex = 15;//15代表灰色
198 range.Font.Size = 9;
199 range.RowHeight = 14.25;
200 range.Borders.LineStyle = 1;
201 range.HorizontalAlignment = 1;
202 }
203 workbook.Saved = true;
204 switch (ExcelVersion)
205 {
206 case "2003":
207 object ob = System.Reflection.Missing.Value;
208 workbook.SaveAs(Path + FileName, Excel.XlFileFormat.xlExcel7, ob, ob, ob, ob, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, ob, ob, ob, ob, ob);
209 workbook.Save();
210 //workbook = null;
211 //worksheet = null;
212 //workbooks = null;
213 //m_xlApp.Quit();
214 //m_xlApp = null;
215 workbook.Close(null, null, null);
216 m_xlApp.Workbooks.Close();
217 m_xlApp.Quit();
218 Marshal.ReleaseComObject((object)m_xlApp);
219 Marshal.ReleaseComObject((object)workbook);
220 Marshal.ReleaseComObject((object)worksheet);
221 break;
222 case "2007":
223 workbook.SaveCopyAs(Path + FileName);
224 workbook.Save();
225 //workbook = null;
226 //worksheet = null;
227 //workbooks = null;
228 //m_xlApp.Quit();
229 //m_xlApp = null;
230 workbook.Close(null, null, null);
231 m_xlApp.Workbooks.Close();
232 m_xlApp.Quit();
233 Marshal.ReleaseComObject((object)m_xlApp);
234 Marshal.ReleaseComObject((object)workbook);
235 Marshal.ReleaseComObject((object)worksheet);
236 break;
237 default: break;
238 }
239 KillProcess("EXCEL");//杀死excel进程
240 tempDataTable = null;
241 }
242 catch (Exception ex)
243 {
244 tempDataTable = null;
245 throw new Exception(ex.Message.ToString());
246 }
247 finally
248 {
249 KillProcess("EXCEL");//杀死excel进程
250 tempDataTable = null;
251 }
252 }
253
254 public void u_DataTableToExcel3(DataTable tempDataTable, string TemplatePath, int StartNum, List<SetExcelContent> Eclist, string tableDesigners, string Path, string FileName, long SheetRows, string ExcelVersion)
255 {
256 if (tempDataTable == null)
257 {
258 return;
259 }
260 object missing = Missing.Value;
261 long rowNum = tempDataTable.Rows.Count;//行数
262 int columnNum = tempDataTable.Columns.Count;//列数
263 Excel.Application m_xlApp = new Excel.Application();
264 m_xlApp.DisplayAlerts = false;//不显示更改提示
265 m_xlApp.Visible = false;
266 m_xlApp.UserControl = true;
267 Excel.Workbook workbook = m_xlApp.Workbooks.Open(TemplatePath, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
268 Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Sheets.get_Item(1);//取得第一个工作簿
269 Excel.Worksheet sheet = (Excel.Worksheet)workbook.Sheets.get_Item(1);//取得第一个工作簿
270 //sheet.Name = "Sheet1";
271 if (sheet == null)//工作簿中没有工作表
272 return;
273
274 //设置模板中的表头
275 foreach (SetExcelContent ec in Eclist)
276 {
277 sheet.Cells[ec.X, ec.Y] = ec.Content.ToString();
278 }
279
280 try
281 {
282 int cell_r = 0, cell_c = 0;
283 for (int i = 1; i <= rowNum; i++)
284 {
285 cell_r = i + StartNum;
286 int row_index = i - 1;//DataTable的行是从0开始的
287 for (int j = 0; j < columnNum; j++)
288 {
289 cell_c = j + 1;//Excel表格的列
290 object obj = tempDataTable.Rows[row_index][tempDataTable.Columns[j].ToString()];
291 sheet.Cells[cell_r, cell_c] = obj == null ? "" : "'" + obj.ToString().Trim();//在obj.ToString()前加单引号是为了防止自动转化格式
292 }
293 }
294
295 //添加表底信息
296 if (!string.IsNullOrEmpty(tableDesigners))
297 {
298 string [] arrDesigner=tableDesigners.Split(new string [] { "~|~" },StringSplitOptions.RemoveEmptyEntries);
299 sheet.Cells[cell_r + 2, 1] = arrDesigner[0];
300 sheet.Cells[cell_r + 2, 2] = arrDesigner[1];
301 sheet.Cells[cell_r + 2, 3] = arrDesigner[2];
302 sheet.Cells[cell_r + 2, 4] = arrDesigner[3];
303
304 //调整Excel的样式
305 Excel.Range range = sheet.Range[worksheet.Cells[StartNum + 1, 1], sheet.Cells[rowNum + StartNum + 2, columnNum]];//结束的要加上表底
306 range.Borders.LineStyle = 1;//单元格加边框
307 }
308 else
309 {
310 //调整Excel的样式
311 Excel.Range range = sheet.Range[worksheet.Cells[StartNum + 1, 1], sheet.Cells[rowNum + StartNum, columnNum]];
312 range.Borders.LineStyle = 1;//单元格加边框
313 }
314
315 workbook.Saved = true;
316 switch (ExcelVersion)
317 {
318 case "2003":
319 object ob = System.Reflection.Missing.Value;
320 workbook.SaveCopyAs(Path + FileName);
321 workbook.Save();
322 workbook.Close(null, null, null);
323 m_xlApp.Workbooks.Close();
324 m_xlApp.Quit();
325 Marshal.ReleaseComObject((object)m_xlApp);
326 Marshal.ReleaseComObject((object)workbook);
327 Marshal.ReleaseComObject((object)worksheet);
328 break;
329 case "2007":
330 workbook.SaveCopyAs(Path + FileName);
331 workbook.Save();
332 workbook.Close(null, null, null);
333 m_xlApp.Workbooks.Close();
334 m_xlApp.Quit();
335 Marshal.ReleaseComObject((object)m_xlApp);
336 Marshal.ReleaseComObject((object)workbook);
337 Marshal.ReleaseComObject((object)worksheet);
338 break;
339 default: break;
340 }
341 KillProcess("EXCEL");//杀死excel进程
342 tempDataTable = null;
343 }
344 catch (Exception ex)
345 {
346 tempDataTable = null;
347 throw new Exception(ex.Message.ToString());
348 }
349 finally
350 {
351 KillProcess("EXCEL");//杀死excel进程
352 tempDataTable = null;
353 }
354
355 }
356
357 //派发勘察,生成楼层格式表,楼宇格式表
358 public void u_DataTableToExcel33(DataTable tempDataTable, string TemplatePath, int StartNum, string Path, string FileName, long SheetRows, string ExcelVersion)
359 {
360 if (tempDataTable == null)
361 {
362 return;
363 }
364 object missing = Missing.Value;
365 long rowNum = tempDataTable.Rows.Count;//行数
366 int columnNum = tempDataTable.Columns.Count;//列数
367 Excel.Application m_xlApp = new Excel.Application();
368 m_xlApp.DisplayAlerts = false;//不显示更改提示
369 m_xlApp.Visible = false;
370 m_xlApp.UserControl = true;
371 Excel.Workbook workbook = m_xlApp.Workbooks.Open(TemplatePath, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
372 Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Sheets.get_Item(1);//取得第一个工作簿
373 Excel.Worksheet sheet = (Excel.Worksheet)workbook.Sheets.get_Item(1);//取得第一个工作簿
374 //sheet.Name = "Sheet1";
375 if (sheet == null)//工作簿中没有工作表
376 return;
377
378 try
379 {
380 int cell_r = 0, cell_c = 0;
381 for (int i = 1; i <= rowNum; i++)
382 {
383 cell_r = i + StartNum;
384 int row_index = i - 1;//DataTable的行是从0开始的
385 for (int j = 0; j < columnNum; j++)
386 {
387 cell_c = j + 1;//Excel表格的列
388 object obj = tempDataTable.Rows[row_index][tempDataTable.Columns[j].ToString()];
389 if (cell_c == 1)
390 {
391 sheet.Cells[cell_r, cell_c] = i;//第一列为序号
392 }
393 else
394 {
395 sheet.Cells[cell_r, cell_c] = obj == null ? "" : "'" + obj.ToString().Trim();//在obj.ToString()前加单引号是为了防止自动转化格式
396 }
397 }
398 }
399
400 //调整Excel的样式
401 Excel.Range range = sheet.Range[worksheet.Cells[StartNum + 1, 1], sheet.Cells[rowNum + StartNum, columnNum]];
402 range.Borders.LineStyle = 1;//单元格加边框
403
404 workbook.Saved = true;
405 switch (ExcelVersion)
406 {
407 case "2003":
408 object ob = System.Reflection.Missing.Value;
409 workbook.SaveCopyAs(Path + FileName);
410 workbook.Save();
411 workbook.Close(null, null, null);
412 m_xlApp.Workbooks.Close();
413 m_xlApp.Quit();
414 Marshal.ReleaseComObject((object)m_xlApp);
415 Marshal.ReleaseComObject((object)workbook);
416 Marshal.ReleaseComObject((object)worksheet);
417 break;
418 case "2007":
419 workbook.SaveCopyAs(Path + FileName);
420 workbook.Save();
421 workbook.Close(null, null, null);
422 m_xlApp.Workbooks.Close();
423 m_xlApp.Quit();
424 Marshal.ReleaseComObject((object)m_xlApp);
425 Marshal.ReleaseComObject((object)workbook);
426 Marshal.ReleaseComObject((object)worksheet);
427 break;
428 default: break;
429 }
430 KillProcess("EXCEL");//杀死excel进程
431 tempDataTable = null;
432 }
433 catch (Exception ex)
434 {
435 tempDataTable = null;
436 throw new Exception(ex.Message.ToString());
437 }
438 finally
439 {
440 KillProcess("EXCEL");//杀死excel进程
441 tempDataTable = null;
442 }
443
444 }
445
446 /// <summary>
447 /// 物料表导出专用
448 /// </summary>
449 public void u_DataTableToExcel4(DataTable tempDataTable, string TemplatePath, int StartNum, List<SetExcelContent> Eclist, string tableDesigners, string Path, string FileName, long SheetRows, string ExcelVersion)
450 {
451 if (tempDataTable == null)
452 {
453 return;
454 }
455 object missing = Missing.Value;
456 long rowNum = tempDataTable.Rows.Count;//行数
457 int columnNum = tempDataTable.Columns.Count;//列数
458 Excel.Application m_xlApp = new Excel.Application();
459 m_xlApp.DisplayAlerts = false;//不显示更改提示
460 m_xlApp.Visible = false;
461 m_xlApp.UserControl = true;
462 Excel.Workbook workbook = m_xlApp.Workbooks.Open(TemplatePath, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
463 Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Sheets.get_Item(1);//取得第一个工作簿
464 Excel.Worksheet sheet = (Excel.Worksheet)workbook.Sheets.get_Item(1);//取得第一个工作簿
465 sheet.Name = "Sheet1";
466 if (sheet == null)//工作簿中没有工作表
467 return;
468
469 //设置模板中的表头
470 foreach (SetExcelContent ec in Eclist)
471 {
472 sheet.Cells[ec.X, ec.Y] = ec.Content.ToString();
473 }
474 int count = 0;
475 try
476 {
477 string preDeviceSort = "", curDeviceSort = "";
478
479 int cell_r = 0, cell_c = 0;
480 for (int i = 1; i <= rowNum; i++)
481 {
482 cell_r = i + StartNum;
483 int row_index = i - 1;//DataTable的行是从0开始的
484 if (!string.IsNullOrEmpty(preDeviceSort) && preDeviceSort.Equals(curDeviceSort))//同一个分类
485 {
486 cell_r = cell_r + count;
487 }
488 for (int j = 0; j < columnNum; j++)
489 {
490 cell_c = j + 1;//Excel表格的列
491 object obj = tempDataTable.Rows[row_index][tempDataTable.Columns[j].ToString()];
492 string cellValue = obj == null ? "" : "'" + obj.ToString().Trim();//在obj.ToString()前加单引号是为了防止自动转化格式
493
494 if (tempDataTable.Columns[j].ColumnName.Equals("DeviceSort"))//分类
495 {
496 curDeviceSort = cellValue;
497 if (preDeviceSort != curDeviceSort)//不同分类
498 {
499 sheet.Cells[cell_r, 1] = curDeviceSort;
500
501 sheet.Cells.get_Range("A" + cell_r, "F" + cell_r).MergeCells = true;//合并单元格
502 sheet.Cells.get_Range("A" + cell_r, "F" + cell_r).Font.Size = "12";//设置字体
503 sheet.Cells.get_Range("A" + cell_r, "F" + cell_r).Interior.Color = System.Drawing.Color.LightGray;//设置单元格背景色
504
505 cell_r = cell_r + 1;//另起一行
506
507 count++;//累计不同分类数
508 }
509 else
510 {
511 cell_c = cell_c + 1;//单元格数加1下面才能减
512 }
513 continue;
514 }
515 cell_c = cell_c - 1;
516 sheet.Cells[cell_r, cell_c] = cellValue;//数据的第一行
517 }
518 preDeviceSort = curDeviceSort;
519 }
520
521 //添加表底信息
522 if (!string.IsNullOrEmpty(tableDesigners))
523 {
524 string[] arrDesigner = tableDesigners.Split(new string[] { "~|~" }, StringSplitOptions.RemoveEmptyEntries);
525 sheet.Cells[cell_r + 2, 1] = arrDesigner[0];
526 sheet.Cells[cell_r + 2, 2] = arrDesigner[1];
527 sheet.Cells[cell_r + 2, 3] = arrDesigner[2];
528 sheet.Cells[cell_r + 2, 4] = arrDesigner[3];
529
530 //调整Excel的样式
531 Excel.Range range = sheet.Range[worksheet.Cells[StartNum + 1, 1], sheet.Cells[cell_r + StartNum + 2, columnNum-1]];//结束的要加上表底
532 range.Borders.LineStyle = 1;//单元格加边框
533 }
534 else
535 {
536 //调整Excel的样式
537 Excel.Range range = sheet.Range[worksheet.Cells[StartNum + 1, 1], sheet.Cells[cell_r + StartNum, columnNum-1]];
538 range.Borders.LineStyle = 1;//单元格加边框
539 }
540
541 workbook.Saved = true;
542 switch (ExcelVersion)
543 {
544 case "2003":
545 object ob = System.Reflection.Missing.Value;
546 workbook.SaveCopyAs(Path + FileName);
547 workbook.Save();
548 workbook.Close(null, null, null);
549 m_xlApp.Workbooks.Close();
550 m_xlApp.Quit();
551 Marshal.ReleaseComObject((object)m_xlApp);
552 Marshal.ReleaseComObject((object)workbook);
553 Marshal.ReleaseComObject((object)worksheet);
554 break;
555 case "2007":
556 workbook.SaveCopyAs(Path + FileName);
557 workbook.Save();
558 workbook.Close(null, null, null);
559 m_xlApp.Workbooks.Close();
560 m_xlApp.Quit();
561 Marshal.ReleaseComObject((object)m_xlApp);
562 Marshal.ReleaseComObject((object)workbook);
563 Marshal.ReleaseComObject((object)worksheet);
564 break;
565 default: break;
566 }
567 KillProcess("EXCEL");//杀死excel进程
568 tempDataTable = null;
569 }
570 catch (Exception ex)
571 {
572 tempDataTable = null;
573 throw new Exception(ex.Message.ToString());
574 }
575 finally
576 {
577 KillProcess("EXCEL");//杀死excel进程
578 tempDataTable = null;
579 }
580
581 }
582
583 /// <summary>
584 /// 预算批量导出
585 /// </summary>
586 public void u_DataTableToExcel5(List<BudgetExport> listBudget, string TemplatePath, string Path, string FileName, long SheetRows, string ExcelVersion)
587 {
588 object missing = Missing.Value;
589 Excel.Application m_xlApp = new Excel.Application();
590 m_xlApp.DisplayAlerts = false;//不显示更改提示
591 m_xlApp.Visible = false;
592 m_xlApp.UserControl = true;
593 Excel.Workbook workbook = m_xlApp.Workbooks.Open(TemplatePath, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
594 Excel.Worksheet worksheet = null;
595
596 int bookCount = workbook.Sheets.Count;
597
598 DataTable tempDataTable = null;
599 int StartNum = 0;
600 List<SetExcelContent> Eclist=null;
601 string tableDesigners = string.Empty;
602 string SheetName = string.Empty;
603 for (int z = 0; z < listBudget.Count; z++)
604 {
605 BudgetExport be=listBudget[z];
606 tempDataTable = be.tempDataTable;
607 StartNum = be.StartNum;
608 Eclist = be.Eclist;
609 tableDesigners = be.tableDesigners;
610 SheetName = be.SheetName;
611
612 if (tempDataTable == null)
613 {
614 continue;
615 }
616 long rowNum = tempDataTable.Rows.Count;//行数
617 int columnNum = tempDataTable.Columns.Count;//列数
618
619 worksheet = (Excel.Worksheet)workbook.Sheets.get_Item(z+1);//取得第一个工作簿
620 Excel.Worksheet sheet = (Excel.Worksheet)workbook.Sheets.get_Item(z+1);//取得第一个工作簿
621 sheet.Name = SheetName;
622 if (sheet == null)//工作簿中没有工作表
623 return;
624
625 //设置模板中的表头
626 if (Eclist != null && Eclist.Count > 0)//表头不为空
627 {
628 foreach (SetExcelContent ec in Eclist)
629 {
630 sheet.Cells[ec.X, ec.Y] = ec.Content.ToString();
631 }
632 }
633
634 try
635 {
636 int cell_r = 0, cell_c = 0;
637 for (int i = 1; i <= rowNum; i++)
638 {
639 cell_r = i + StartNum;
640 int row_index = i - 1;//DataTable的行是从0开始的
641 for (int j = 0; j < columnNum; j++)
642 {
643 cell_c = j + 1;//Excel表格的列
644 object obj = tempDataTable.Rows[row_index][tempDataTable.Columns[j].ToString()];
645 sheet.Cells[cell_r, cell_c] = obj == null ? "" : "'" + obj.ToString().Trim();//在obj.ToString()前加单引号是为了防止自动转化格式
646 }
647 }
648
649 //添加表底信息
650 if (!string.IsNullOrEmpty(tableDesigners))
651 {
652 string[] arrDesigner = tableDesigners.Split(new string[] { "~|~" }, StringSplitOptions.RemoveEmptyEntries);
653 sheet.Cells[cell_r + 2, 1] = arrDesigner[0];
654 sheet.Cells[cell_r + 2, 2] = arrDesigner[1];
655 sheet.Cells[cell_r + 2, 3] = arrDesigner[2];
656 sheet.Cells[cell_r + 2, 4] = arrDesigner[3];
657
658 //调整Excel的样式
659 Excel.Range range = sheet.Range[worksheet.Cells[StartNum + 1, 1], sheet.Cells[rowNum + StartNum + 2, columnNum]];//结束的要加上表底
660 range.Borders.LineStyle = 1;//单元格加边框
661 }
662 else
663 {
664 //调整Excel的样式
665 Excel.Range range = sheet.Range[worksheet.Cells[StartNum + 1, 1], sheet.Cells[rowNum + StartNum, columnNum]];
666 range.Borders.LineStyle = 1;//单元格加边框
667 }
668 }
669 catch (Exception ex)
670 {
671 tempDataTable = null;
672 throw new Exception(ex.Message.ToString());
673 }
674 finally
675 {
676 tempDataTable = null;
677 }
678 }
679
680 workbook.Saved = true;
681 switch (ExcelVersion)
682 {
683 case "2003":
684 object ob = System.Reflection.Missing.Value;
685 workbook.SaveCopyAs(Path + FileName);
686 workbook.Save();
687 workbook.Close(null, null, null);
688 m_xlApp.Workbooks.Close();
689 m_xlApp.Quit();
690 Marshal.ReleaseComObject((object)m_xlApp);
691 Marshal.ReleaseComObject((object)workbook);
692 if (worksheet != null)
693 {
694 Marshal.ReleaseComObject((object)worksheet);
695 }
696 break;
697 case "2007":
698 workbook.SaveCopyAs(Path + FileName);
699 workbook.Save();
700 workbook.Close(null, null, null);
701 m_xlApp.Workbooks.Close();
702 m_xlApp.Quit();
703 Marshal.ReleaseComObject((object)m_xlApp);
704 Marshal.ReleaseComObject((object)workbook);
705 if (worksheet != null)
706 {
707 Marshal.ReleaseComObject((object)worksheet);
708 }
709 break;
710 default: break;
711 }
712 KillProcess("EXCEL");//杀死excel进程
713 tempDataTable = null;
714 }
715
716 /// <summary>
717 /// 按项目-信源统计
718 /// </summary>
719 public void u_DataTableToExcel6(DataTable tempDataTable, string Path, string FileName, long SheetRows, string ExcelVersion, bool Statistics = false)
720 {
721 if (tempDataTable == null)
722 {
723 return;
724 }
725 object missing = Missing.Value;
726 long rowNum = tempDataTable.Rows.Count;//行数
727 int columnNum = tempDataTable.Columns.Count;//列数
728 Excel.Application m_xlApp = new Excel.Application();
729 m_xlApp.DisplayAlerts = false;//不显示更改提示
730 m_xlApp.Visible = false;
731 m_xlApp.UserControl = true;
732
733 Excel.Workbooks workbooks = m_xlApp.Workbooks;
734 Excel.Workbook workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
735 Excel.Worksheet sheet = (Excel.Worksheet)workbook.Worksheets[1];//取得sheet1
736 sheet.Name = "Sheet1";
737 if (sheet == null)//工作簿中没有工作表
738 return;
739
740 try
741 {
742 string SerialNum = "", StationNum = "", StationName = "", lastSerialNum = "", lastStationNum = "", lastStationName = "";
743
744 for (int i = 0; i < columnNum; i++) //写入字段
745 {
746 sheet.Cells[1, i + 1] = tempDataTable.Columns[i].Caption;
747 }
748 Excel.Range range = sheet.Range[sheet.Cells[1, 1], sheet.Cells[1, columnNum]];
749 range.Interior.ColorIndex = 15;//15代表灰色
750 range.Font.Bold = true;
751 range.Font.Size = 9;
752
753 int cell_r = 0, cell_c = 0;
754 int sameCount = 0;
755 bool firstMergeFlag = true;
756 for (int i = 1; i <= rowNum; i++)
757 {
758 cell_r = i + 1;//表头算1列
759 int row_index = i - 1;//DataTable的行是从0开始的
760 for (int j = 0; j < columnNum; j++)
761 {
762 cell_c = j + 1;//Excel表格的列
763 object obj = tempDataTable.Rows[row_index][tempDataTable.Columns[j].ToString()];
764 sheet.Cells[cell_r, cell_c] = obj == null ? "" : "'" + obj.ToString().Trim();//在obj.ToString()前加单引号是为了防止自动转化格式
765
766 if (j < 3)
767 {
768 if (tempDataTable.Columns[j].Caption == "序号")
769 {
770 SerialNum = obj.ToString().Trim();
771 }
772 else if (tempDataTable.Columns[j].Caption == "站号")
773 {
774 StationNum = obj.ToString().Trim();
775 }
776 else if (tempDataTable.Columns[j].Caption == "站名")
777 {
778 StationName = obj.ToString().Trim();
779 }
780 }
781 }
782 if (SerialNum != lastSerialNum && StationNum != lastStationNum && StationName != lastStationName)//不一样时才赋值
783 {
784 if (cell_r > 2)
785 {
786 int startRowIndex = 0;
787 int endRowIndex = 0;
788 if (firstMergeFlag)//第一次合并
789 {
790 startRowIndex = 2;
791 endRowIndex = startRowIndex + sameCount;
792 }
793 else
794 {
795 startRowIndex = cell_r - sameCount-1;
796 endRowIndex = cell_r-1;
797 }
798 //合并单元格
799 //sheet.Cells.get_Range("A" + startRowIndex, "A" + endRowIndex).MergeCells = true;
800 //sheet.Cells.get_Range("B" + startRowIndex, "B" + endRowIndex).MergeCells = true;
801 //sheet.Cells.get_Range("C" + startRowIndex, "C" + endRowIndex).MergeCells = true;
802
803 range = sheet.Cells.get_Range("A" + startRowIndex, "A" + endRowIndex);//get_Range("起始单元格,如A1","结束单元格,如G10"); 即表示一块区域
804 range.Clear();
805 range.Font.Size = 12;//设置字体大小
806 range.Font.Bold = true;//设置字体加粗
807 range.Merge(0);//单元格合并
808 range.Value = "'" + lastSerialNum;//设置单元格内容
809 range.Borders.LineStyle = 1;//加边框
810 range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
811 range.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;
812 range = null;
813 range = sheet.Cells.get_Range("B" + startRowIndex, "B" + endRowIndex);
814 range.Clear();
815 range.Font.Size = 12;//设置字体大小
816 range.Font.Bold = true;//设置字体加粗
817 range.Merge(0);//单元格合并
818 range.Value = "'" + lastStationNum;//设置单元格内容
819 range.Borders.LineStyle = 1;//加边框
820 range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
821 range.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;
822 range = null;
823 range = sheet.Cells.get_Range("C" + startRowIndex, "C" + endRowIndex);
824 range.Clear();
825 range.Font.Size = 12;//设置字体大小
826 range.Font.Bold = true;//设置字体加粗
827 range.Merge(0);//单元格合并
828 range.Value = "'" + lastStationName;//设置单元格内容
829 range.Borders.LineStyle = 1;//加边框
830 range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
831 range.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;
832 range = null;
833
834 sameCount = 0;
835 firstMergeFlag = false;
836 }
837
838 lastSerialNum = SerialNum;
839 lastStationNum = StationNum;
840 lastStationName = StationName;
841 }
842 else
843 {
844 if (firstMergeFlag && string.IsNullOrEmpty(lastSerialNum) && string.IsNullOrEmpty(lastStationNum) && string.IsNullOrEmpty(lastStationName))
845 {
846 lastSerialNum = SerialNum;
847 lastStationNum = StationNum;
848 lastStationName = StationName;
849 }
850 if (cell_r > 2 && SerialNum == lastSerialNum && StationNum == lastStationNum && StationName == lastStationName)
851 {
852 sameCount++;//序号,站号,站名相同的个数
853 }
854 else
855 {
856 //处理空值合并
857 if (cell_r > 2)
858 {
859 int startRowIndex = 0;
860 int endRowIndex = 0;
861 if (firstMergeFlag)//第一次合并
862 {
863 startRowIndex = 2;
864 endRowIndex = startRowIndex + sameCount;
865 }
866 else
867 {
868 startRowIndex = cell_r - sameCount - 1;
869 endRowIndex = cell_r - 1;
870 }
871 //合并单元格
872 //sheet.Cells.get_Range("A" + startRowIndex, "A" + endRowIndex).MergeCells = true;
873 //sheet.Cells.get_Range("B" + startRowIndex, "B" + endRowIndex).MergeCells = true;
874 //sheet.Cells.get_Range("C" + startRowIndex, "C" + endRowIndex).MergeCells = true;
875
876 range = sheet.Cells.get_Range("A" + startRowIndex, "A" + endRowIndex);//get_Range("起始单元格,如A1","结束单元格,如G10"); 即表示一块区域
877 range.Clear();
878 range.Font.Size = 12;//设置字体大小
879 range.Font.Bold = true;//设置字体加粗
880 range.Merge(0);//单元格合并
881 range.Value = "'" + lastSerialNum;//设置单元格内容
882 range.Borders.LineStyle = 1;//加边框
883 range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
884 range.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;
885 range = null;
886 range = sheet.Cells.get_Range("B" + startRowIndex, "B" + endRowIndex);
887 range.Clear();
888 range.Font.Size = 12;//设置字体大小
889 range.Font.Bold = true;//设置字体加粗
890 range.Merge(0);//单元格合并
891 range.Value = "'" + lastStationNum;//设置单元格内容
892 range.Borders.LineStyle = 1;//加边框
893 range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
894 range.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;
895 range = null;
896 range = sheet.Cells.get_Range("C" + startRowIndex, "C" + endRowIndex);
897 range.Clear();
898 range.Font.Size = 12;//设置字体大小
899 range.Font.Bold = true;//设置字体加粗
900 range.Merge(0);//单元格合并
901 range.Value = "'" + lastStationName;//设置单元格内容
902 range.Borders.LineStyle = 1;//加边框
903 range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
904 range.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;
905 range = null;
906
907 sameCount = 0;
908 firstMergeFlag = false;
909 }
910
911 lastSerialNum = SerialNum;
912 lastStationNum = StationNum;
913 lastStationName = StationName;
914 }
915 }
916
917 if (cell_r == (rowNum + 1) && sameCount > 0)//最后一行,还有未合并的
918 {
919 int startRowIndex = cell_r - sameCount;
920 int endRowIndex = cell_r;
921
922 //合并单元格
923 //sheet.Cells.get_Range("A" + startRowIndex, "A" + endRowIndex).MergeCells = true;
924 //sheet.Cells.get_Range("B" + startRowIndex, "B" + endRowIndex).MergeCells = true;
925 //sheet.Cells.get_Range("C" + startRowIndex, "C" + endRowIndex).MergeCells = true;
926
927 range = sheet.get_Range("A" + startRowIndex, "A" + endRowIndex);//get_Range("起始单元格,如A1","结束单元格,如G10"); 即表示一块区域
928 range.Clear();
929 range.Font.Size = 12;//设置字体大小
930 range.Font.Bold = true;//设置字体加粗
931 range.Merge(0);//单元格合并
932 range.Value = "'" + lastSerialNum;//设置单元格内容
933 range.Borders.LineStyle = 1;//加边框
934 range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
935 range.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;
936 range = null;
937 range = sheet.get_Range("B" + startRowIndex, "B" + endRowIndex);
938 range.Clear();
939 range.Font.Size = 12;//设置字体大小
940 range.Font.Bold = true;//设置字体加粗
941 range.Merge(0);//单元格合并
942 range.Value = "'" + lastStationNum;//设置单元格内容
943 range.Borders.LineStyle = 1;//加边框
944 range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
945 range.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;
946 range = null;
947 range = sheet.get_Range("C" + startRowIndex, "C" + endRowIndex);
948 range.Clear();
949 range.Font.Size = 12;//设置字体大小
950 range.Font.Bold = true;//设置字体加粗
951 range.Merge(0);//单元格合并
952 range.Value = "'" + lastStationName;//设置单元格内容
953 range.Borders.LineStyle = 1;//加边框
954 range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
955 range.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;
956 range = null;
957
958 sameCount = 0;
959 }
960 if (Statistics && cell_r == (rowNum + 1))//最后一行是汇总信息合并单元格
961 {
962 sheet.Cells.get_Range("A" + cell_r, "F" + cell_r).MergeCells = true;
963 }
964 }
965
966 //调整Excel的样式
967 range = sheet.Range[sheet.Cells[1, 1], sheet.Cells[rowNum + 1, columnNum]];
968 range.Borders.LineStyle = 1;//单元格加边框
969
970 sheet.Columns.EntireColumn.AutoFit();//列宽自适应。
971
972 workbook.Saved = true;
973 switch (ExcelVersion)
974 {
975 case "2003":
976 object ob = System.Reflection.Missing.Value;
977 workbook.SaveCopyAs(Path + FileName);
978 workbook.Save();
979 workbook.Close(null, null, null);
980 m_xlApp.Workbooks.Close();
981 m_xlApp.Quit();
982 Marshal.ReleaseComObject((object)m_xlApp);
983 Marshal.ReleaseComObject((object)workbook);
984 Marshal.ReleaseComObject((object)sheet);
985 break;
986 case "2007":
987 workbook.SaveCopyAs(Path + FileName);
988 workbook.Save();
989 workbook.Close(null, null, null);
990 m_xlApp.Workbooks.Close();
991 m_xlApp.Quit();
992 Marshal.ReleaseComObject((object)m_xlApp);
993 Marshal.ReleaseComObject((object)workbook);
994 Marshal.ReleaseComObject((object)sheet);
995 break;
996 default: break;
997 }
998 KillProcess("EXCEL");//杀死excel进程
999 tempDataTable = null;
1000 }
1001 catch (Exception ex)
1002 {
1003 tempDataTable = null;
1004 throw new Exception(ex.Message.ToString());
1005 }
1006 finally
1007 {
1008 KillProcess("EXCEL");//杀死excel进程
1009 tempDataTable = null;
1010 }
1011 }
1012
1013 //调用
1014 //int excelCount = sheet.UsedRange.CurrentRegion.Rows.Count;//获得记录的行数
1015 //MergeCell(ref sheet, 2, excelCount, "A");//合并单元格
1016 //MergeCell(ref sheet, 2, excelCount, "B");//合并单元格
1017 //MergeCell(ref sheet, 2, excelCount, "C");//合并单元格
1018
1019 /// <summary>
1020 /// 合并指定EXCEL的单元格
1021 /// </summary>
1022 /// <param name="mySheet">指定的EXCEL工作表</param>
1023 /// <param name="startLine">起始行</param>
1024 /// <param name="recCount">总行数</param>
1025 /// <param name="col">要合并的列</param>
1026 private void MergeCell(ref Microsoft.Office.Interop.Excel.Worksheet mySheet, int startLine, int recCount, string col)
1027 {
1028 //获得起始行合并列单元格的填充内容
1029 string qy1 = mySheet.get_Range(col + startLine.ToString(), col + startLine.ToString()).Text.ToString();
1030
1031 Microsoft.Office.Interop.Excel.Range rg1;
1032 string strtemp = "";
1033 bool endCycle = false;
1034
1035 //从起始行到终止行做循环
1036 for (int i = startLine; i <= recCount + startLine - 1 && !endCycle; )
1037 {
1038 for (int j = i + 1; j <= recCount + startLine - 1; j++)
1039 {
1040 rg1 = mySheet.get_Range(col + j.ToString(), col + j.ToString());//获得下一行的填充内容
1041 strtemp = rg1.Text.ToString().Trim();
1042 //最后一行时,标记循环结束
1043 if (j == recCount + startLine - 1)
1044 endCycle = true;
1045 if (strtemp.Trim() == qy1.Trim())//内容等于初始内容
1046 {
1047 rg1 = mySheet.get_Range(col + i.ToString(), col + j.ToString());//选取上条合并位置和当前行的合并区域
1048 rg1.ClearContents();//清空要合并的区域
1049 rg1.MergeCells = true;
1050 if (col == "A")
1051 mySheet.Cells[i, 1] = qy1;
1052 else if (col == "B")
1053 mySheet.Cells[i, 2] = qy1;
1054 else if (col == "C")
1055 mySheet.Cells[i, 3] = qy1;
1056 }
1057 else//内容不等于初始内容
1058 {
1059 i = j;//i获取新值
1060 qy1 = mySheet.get_Range(col + j.ToString(), col + j.ToString()).Text.ToString();
1061 break;
1062 }
1063 }
1064 }
1065 }
1066
1067 //室分类需求网建反馈情况统计
1068 public void u_DataTableToExcel7(DataTable tempDataTable, string TemplatePath, int percent, string Path, string FileName, long SheetRows, string ExcelVersion)
1069 {
1070 if (tempDataTable == null)
1071 {
1072 return;
1073 }
1074 object missing = Missing.Value;
1075 long rowNum = tempDataTable.Rows.Count;//行数
1076 int columnNum = tempDataTable.Columns.Count;//列数
1077 Excel.Application m_xlApp = new Excel.Application();
1078 m_xlApp.DisplayAlerts = false;//不显示更改提示
1079 m_xlApp.Visible = false;
1080 m_xlApp.UserControl = true;
1081 Excel.Workbook workbook = m_xlApp.Workbooks.Open(TemplatePath, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
1082 Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Sheets.get_Item(1);//取得第一个工作簿
1083 if (worksheet == null)//工作簿中没有工作表
1084 return;
1085
1086 try
1087 {
1088 worksheet.Cells[2, 4] = "非0前" + percent.ToString() + "%";
1089
1090 for (int i = 0; i < rowNum; i++)
1091 {
1092 for (int j = 1; j < columnNum; j++)
1093 {
1094 object obj = tempDataTable.Rows[i][tempDataTable.Columns[j].ToString()];
1095 worksheet.Cells[i + 3, j + 1] = obj == null ? "" : "'" + obj.ToString().Trim();//在obj.ToString()前加单引号是为了防止自动转化格式
1096 }
1097 }
1098
1099 workbook.Saved = true;
1100 switch (ExcelVersion)
1101 {
1102 case "2003":
1103 object ob = System.Reflection.Missing.Value;
1104 workbook.SaveCopyAs(Path + FileName);
1105 workbook.Save();
1106 workbook.Close(null, null, null);
1107 m_xlApp.Workbooks.Close();
1108 m_xlApp.Quit();
1109 Marshal.ReleaseComObject((object)m_xlApp);
1110 Marshal.ReleaseComObject((object)workbook);
1111 Marshal.ReleaseComObject((object)worksheet);
1112 break;
1113 case "2007":
1114 workbook.SaveCopyAs(Path + FileName);
1115 workbook.Save();
1116 workbook.Close(null, null, null);
1117 m_xlApp.Workbooks.Close();
1118 m_xlApp.Quit();
1119 Marshal.ReleaseComObject((object)m_xlApp);
1120 Marshal.ReleaseComObject((object)workbook);
1121 Marshal.ReleaseComObject((object)worksheet);
1122 break;
1123 default: break;
1124 }
1125 KillProcess("EXCEL");//杀死excel进程
1126 tempDataTable = null;
1127 }
1128 catch (Exception ex)
1129 {
1130 tempDataTable = null;
1131 throw new Exception(ex.Message.ToString());
1132 }
1133 finally
1134 {
1135 KillProcess("EXCEL");//杀死excel进程
1136 tempDataTable = null;
1137 }
1138
1139 }
1140
1141 /// <summary>
1142 /// 泰和 楼宇格式表生成
1143 /// </summary>
1144 public void u_DataTableToExcel8(DataTable dt, string TemplatePath, string Path, string FileName, long SheetRows, string ExcelVersion)
1145 {
1146 object missing = Missing.Value;
1147 Excel.Application m_xlApp = new Excel.Application();
1148 m_xlApp.DisplayAlerts = false;//不显示更改提示
1149 m_xlApp.Visible = false;
1150 m_xlApp.UserControl = true;
1151 Excel.Workbook workbook = m_xlApp.Workbooks.Open(TemplatePath, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
1152 Excel.Worksheet worksheet = null;
1153
1154 int bookCount = workbook.Sheets.Count;
1155
1156 int StartNum = 3;//从第三行开始 第一行、第二行为列填写要求说明
1157 string SheetName = "楼宇格式表";
1158 long rowNum = dt.Rows.Count;//行数
1159 int columnNum = dt.Columns.Count;//列数
1160
1161 Excel.Worksheet sheet = (Excel.Worksheet)workbook.Sheets.get_Item(1);//取得第一个工作簿
1162 sheet.Name = SheetName;
1163 if (sheet == null)//工作簿中没有工作表
1164 return;
1165
1166 for (int z = 0; z < dt.Rows.Count; z++)
1167 {
1168 try
1169 {
1170 sheet.Cells[z + StartNum, 1] = z + 1;//第一列 序号列
1171 sheet.Cells[z + StartNum, 2] = dt.Rows[z][0] == null ? "" : "'" + dt.Rows[z][0].ToString().Trim();//楼宇名称列 在obj.ToString()前加单引号是为了防止自动转化格式
1172 sheet.Cells[z + StartNum, 6] = dt.Rows[z][1] == null ? "" : "'" + dt.Rows[z][1].ToString().Trim();//所属分公司列
1173 sheet.Cells[z + StartNum, 10] = dt.Rows[z][2] == null ? "" : "'" + dt.Rows[z][2].ToString().Trim();//经度
1174 sheet.Cells[z + StartNum, 11] = dt.Rows[z][3] == null ? "" : "'" + dt.Rows[z][3].ToString().Trim();//纬度
1175
1176 }
1177 catch (Exception ex)
1178 {
1179 dt = null;
1180 throw new Exception(ex.Message.ToString());
1181 }
1182 finally
1183 {
1184
1185 }
1186 }
1187
1188 workbook.Saved = true;
1189 switch (ExcelVersion)
1190 {
1191 case "2003":
1192 object ob = System.Reflection.Missing.Value;
1193 workbook.SaveCopyAs(Path + FileName);
1194 workbook.Save();
1195 workbook.Close(null, null, null);
1196 m_xlApp.Workbooks.Close();
1197 m_xlApp.Quit();
1198 Marshal.ReleaseComObject((object)m_xlApp);
1199 Marshal.ReleaseComObject((object)workbook);
1200 if (worksheet != null)
1201 {
1202 Marshal.ReleaseComObject((object)worksheet);
1203 }
1204 break;
1205 case "2007":
1206 workbook.SaveCopyAs(Path + FileName);
1207 workbook.Save();
1208 workbook.Close(null, null, null);
1209 m_xlApp.Workbooks.Close();
1210 m_xlApp.Quit();
1211 Marshal.ReleaseComObject((object)m_xlApp);
1212 Marshal.ReleaseComObject((object)workbook);
1213 if (worksheet != null)
1214 {
1215 Marshal.ReleaseComObject((object)worksheet);
1216 }
1217 break;
1218 default: break;
1219 }
1220 KillProcess("EXCEL");//杀死excel进程
1221 dt = null;
1222 }
1223
1224 #endregion
1225 #region 内部接口
1226 //作用将dt的(startindex到endindex的数据导出到filename)---用于将海量数据导出到多个excel文件
1227 private void u_OutExcel(DataTable dt, long startindex, long endindex, string filepath, string filename, string ExcelVersion)
1228 {
1229 long columnNum = dt.Columns.Count;
1230 long excelRows = endindex - startindex - 1;
1231 Excel.Application m_xlApp = new Excel.Application();
1232 m_xlApp.DisplayAlerts = false;//不显示更改提示
1233 m_xlApp.Visible = false;
1234 Excel.Workbooks workbooks = m_xlApp.Workbooks;
1235 Excel.Workbook workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
1236 Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets[1];//取得sheet1
1237 try
1238 {
1239 string[,] datas = new string[excelRows + 1, columnNum];
1240 for (int i = 0; i < columnNum; i++) //写入表头字段
1241 {
1242 string sTitle = dt.Columns[i].ColumnName;
1243 datas[0, i] = sTitle;//表头信息
1244 }
1245 Excel.Range range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, columnNum]);
1246 range.Interior.ColorIndex = 15;//15代表灰色
1247 range.Font.Bold = true;
1248 range.Font.Size = 9;
1249 int r = 0;
1250 int row = 0;
1251 for (r = Convert.ToInt32(startindex); r < endindex - 1; r++)
1252 {
1253 row++;
1254 for (int i = 0; i < columnNum; i++)
1255 {
1256 string sname = dt.Columns[i].ToString().Trim();
1257 object obj = dt.Rows[r][sname];
1258 datas[row, i] = obj == null ? "" : "'" + obj.ToString().Trim();//在obj.ToString()前加单引号是为了防止自动转化格式
1259 }
1260 }
1261
1262 Excel.Range fchR = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[excelRows + 1, columnNum]);
1263 fchR.Value2 = datas;
1264 worksheet.Columns.EntireColumn.AutoFit();//列宽自适应。
1265 m_xlApp.WindowState = Excel.XlWindowState.xlMaximized;
1266 range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[excelRows + 1, columnNum]);
1267 //range.Interior.ColorIndex = 15;//15代表灰色
1268 range.Font.Size = 9;
1269 range.RowHeight = 14.25;
1270 range.Borders.LineStyle = 1;//1边框为实线 0为excel样式
1271 range.HorizontalAlignment = 1;
1272 workbook.Saved = true;
1273 switch (ExcelVersion)
1274 {
1275 case "2003":
1276 object ob = System.Reflection.Missing.Value;
1277 workbook.SaveAs(filepath + filename, Excel.XlFileFormat.xlExcel7, ob, ob, ob, ob, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, ob, ob, ob, ob, ob);
1278 break;
1279 case "2007":
1280 workbook.SaveCopyAs(filepath + filename);
1281 break;
1282 default: break;
1283 }
1284 KillProcess("EXCEL");//杀死excel进程
1285 }
1286 catch (Exception ex)
1287 {
1288 KillProcess("EXCEL");
1289 throw new Exception(ex.Message.ToString());
1290 }
1291 finally
1292 {
1293 workbook.Close(null, null, null);
1294 m_xlApp.Workbooks.Close();
1295 m_xlApp.Quit();
1296 Marshal.ReleaseComObject((object)m_xlApp);
1297 Marshal.ReleaseComObject((object)workbook);
1298 Marshal.ReleaseComObject((object)worksheet);
1299 KillProcess("EXCEL");
1300 }
1301
1302 }
1303 //关闭进程
1304 private void KillProcess(string processName)
1305 {
1306 //System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
1307
1308 System.Diagnostics.Process myproc = new System.Diagnostics.Process();
1309 try
1310 {
1311 foreach (System.Diagnostics.Process thisproc in System.Diagnostics.Process.GetProcessesByName(processName))
1312 {
1313 thisproc.Kill();
1314 GC.Collect();
1315 }
1316 }
1317 catch
1318 {
1319
1320 }
1321 }
1322 #endregion
1323 }
1324
1325 public class SetExcelContent
1326 {
1327 public int X{set;get;}
1328 public int Y{set;get;}
1329 public string Content{set;get;}
1330
1331 public SetExcelContent()
1332 {
1333 }
1334
1335 public SetExcelContent(int _x,int _y,string _content)
1336 {
1337 this.X=_x;
1338 this.Y=_y;
1339 this.Content=_content;
1340 }
1341 }
1342
1343 //预算导出类
1344 public class BudgetExport
1345 {
1346 public DataTable tempDataTable { get; set; }
1347 public int StartNum { get; set; }
1348 public List<SetExcelContent> Eclist { get; set; }
1349 public string tableDesigners { get; set; }
1350 public string SheetName { get; set; }
1351
1352 public BudgetExport()
1353 {
1354
1355 }
1356
1357 public BudgetExport(DataTable _tempDataTable, int _StartNum, List<SetExcelContent> _Eclist,
1358 string _tableDesigners, string _SheetName)
1359 {
1360 this.tempDataTable = _tempDataTable;
1361 this.StartNum = _StartNum;
1362 this.Eclist = _Eclist;
1363 this.tableDesigners = _tableDesigners;
1364 this.SheetName = _SheetName;
1365 }
1366 }
1367 }