Newer
Older
GHFX_REFACTOR / ExpEXCEL.cs
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using GeoScene.Data;
using Microsoft.Office.Interop.Excel;
using Application = Microsoft.Office.Interop.Excel.Application;
using DataTable = System.Data.DataTable;

namespace Cyberpipe
{
    class ExpEXCEL
    {
        /// <summary>
        /// 导出EXCEL单个SHEET
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="strSaveFile"></param>
        public static void ExpToExcel(DataGridView dt, string strSaveFile,string str)
        {
            //创建一个EXCEL应用程序
            Application excel = new Application();
            //是否显示导出过程(显示创建后的EXCEL)
            excel.Visible = false;
            //定义缺省值
            Missing miss = Missing.Value;
            //创建一个新的工作簿
            Workbooks workbooks = excel.Workbooks;
            Workbook workbook = workbooks.Add(miss);
            Worksheet sheet = workbook.Worksheets[1];

            sheet.Name = str;
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                sheet.Cells[1, i + 1] = dt.Columns[i].HeaderText;
            }

            //填充数据
            for (int i = 0; i < dt.Rows.Count; i++)//所要添加的行数
            {
                for (int j = 0; j < dt.Columns.Count; j++)//每行的列数
                {
                    //将数据填充到对应的单元格中
                    sheet.Cells[i + 2, j + 1] = dt.Rows[i].Cells[j].Value.ToString();
                }
            }
            sheetStype(sheet, dt);

            //保存文件
            string strSaveFile2 = strSaveFile;
            if (File.Exists(strSaveFile2))
            {
                int z = 1;
                do
                {
                    strSaveFile2 = Path.Combine(Path.GetDirectoryName(strSaveFile) + "\\" + Path.GetFileNameWithoutExtension(strSaveFile) + z + ".xlsx");
                    z++;
                } while (File.Exists(strSaveFile2));
            }

            sheet.SaveAs(strSaveFile2, miss, miss, miss, miss, miss, XlSaveAsAccessMode.xlNoChange, miss, miss, miss);
            //关闭表格
            workbook.Close(false, miss, miss);
            workbooks.Close();
            //释放资源
            excel.Quit();

        }

        /// <summary>
        /// 将DataTable保存为Excel文件,两个SHEET
        /// </summary>
        public static void ExpToExcel(DataGridView dt1, DataGridView dt, string strSaveFile)
        {
            //创建一个EXCEL应用程序
            Application excel = new Application();
            //是否显示导出过程(显示创建后的EXCEL)
            excel.Visible = false;
            excel.Workbooks.Add(true);

            //定义缺省值
            Missing miss = Missing.Value;
            //创建一个新的工作簿
            Workbooks workbooks = excel.Workbooks;

            Workbook workbook = workbooks.Add(miss);

            Worksheet sheet = workbook.Worksheets[1];

            Worksheet sheet1;

            if (workbook.Worksheets.Count == 1)
            {
                sheet1 = (Worksheet)workbook.Worksheets.Add(miss, workbook.ActiveSheet);
            }
            else {
                sheet1 = workbook.Worksheets[2];
            }

            
            sheet.Name = "垂直距离";
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                sheet.Cells[1, i + 1] = dt.Columns[i].HeaderText;
            }

            //填充数据
            for (int i = 0; i < dt.Rows.Count; i++)//所要添加的行数
            {
                for (int j = 0; j < dt.Columns.Count; j++)//每行的列数
                {
                    //将数据填充到对应的单元格中
                    sheet.Cells[i + 2, j + 1] = dt.Rows[i].Cells[j].Value.ToString();
                }
            }

            sheetStype(sheet, dt);

            sheet1.Name = "水平距离";
            for (int i = 0; i < dt1.Columns.Count; i++)
            {
                sheet1.Cells[1, i + 1] = dt1.Columns[i].HeaderText;
            }

            //填充数据
            for (int i = 0; i < dt1.Rows.Count; i++)//所要添加的行数
            {
                for (int j = 0; j < dt1.Columns.Count; j++)//每行的列数
                {
                    //将数据填充到对应的单元格中
                    sheet1.Cells[i + 2, j + 1] = dt1.Rows[i].Cells[j].Value.ToString();
                }
            }

            sheetStype(sheet, dt1);

            //保存文件
            string strSaveFile2 = strSaveFile;
            if (File.Exists(strSaveFile2))
            {
                int z = 1;
                do
                {
                    strSaveFile2 = Path.Combine(Path.GetDirectoryName(strSaveFile) + "\\" + Path.GetFileNameWithoutExtension(strSaveFile) + z + ".xlsx");
                    z++;
                } while (File.Exists(strSaveFile2));
            }

            sheet.SaveAs(strSaveFile2, miss, miss, miss, miss, miss, XlSaveAsAccessMode.xlNoChange, miss, miss, miss);
            //关闭表格
            workbook.Close(false, miss, miss);
            workbooks.Close();
            //释放资源
            excel.Quit();
            KillProcess(excel);
        }

        static List<String> sheetNameList = new List<string>();
        /// <summary>
        /// 导出EXCEL多个SHEET(红线审核导出用)
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="strSaveFile"></param>
        public static void ExpToExcelContain(DataGridView dt, string strSaveFile, string str)
        {
            if (dt.Rows.Count == 0) return;
            sheetNameList.Clear();
            string layerName = ""; 
            string redLineName = "";

            Application excel = new Application();//创建一个EXCEL应用程序
            excel.Visible = false; //是否显示导出过程(显示创建后的EXCEL)
            Missing miss = Missing.Value;//定义缺省值
            Workbooks workbooks = excel.Workbooks;//创建一个新的工作簿
            Workbook workbook = workbooks.Add(miss);
            Worksheet sheet = null;

            sheet.Name = str;
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                sheet.Cells[1, i + 1] = dt.Columns[i].HeaderText;
            }
            //填充数据
            for (int i = 0; i < dt.Rows.Count; i++)//所要添加的行数
            {
                for (int j = 0; j < dt.Columns.Count; j++)//每行的列数
                {
                    sheet.Cells[i + 2, j + 1] = dt.Rows[i].Cells[j].Value.ToString();//将数据填充到对应的单元格中
                }
            }
            sheetStype(sheet, dt);

            for (int sheetCount = 0; sheetCount <= dt.Rows.Count; sheetCount++)
            {
                if (workbook.Worksheets.Count > sheetCount)
                    sheet = workbook.Worksheets[sheetCount + 1];
                else
                    sheet = (Worksheet) workbook.Worksheets.Add(miss, workbook.ActiveSheet);

                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    sheet.Cells[1, i + 1] = dt.Columns[i].HeaderText;
                }
                DataTable dataTable = new DataTable();
                dataTable.Columns.Add("图层类型");
                dataTable.Columns.Add("编号");

                layerName = dt.Rows[sheetCount - 1].Cells["管线类型"].Value.ToString();
                redLineName = dt.Rows[sheetCount - 1].Cells["红线编号"].Value.ToString();

                for (int i = 0; i < RedLineAnalysisTool.redLineResultList[sheetCount].LineFeaturesInRedLine.Length; i++)
                {
                    if (RedLineAnalysisTool.redLineResultList[sheetCount].LineFeaturesInRedLine[i].Dataset.Caption == layerName
                        && RedLineAnalysisTool.redLineResultList[sheetCount].RedLineName == redLineName)
                    {
                        DataRow row = dataTable.NewRow();
                        row[0] = RedLineAnalysisTool.redLineResultList[sheetCount].LineFeaturesInRedLine[i].Dataset.Caption;
                        row[1] = RedLineAnalysisTool.redLineResultList[sheetCount].LineFeaturesInRedLine[i].Name;
                        dataTable.Rows.Add(row);
                    }
                }
                if (RedLineAnalysisTool.redLineResultList[sheetCount].PointFeaturesInRedLine.Length > 0)
                {
                    for (int j = 0; j < RedLineAnalysisTool.redLineResultList[sheetCount].PointFeaturesInRedLine.Length;j++)
                    {
                        GSOFeatures feats = RedLineAnalysisTool.redLineResultList[sheetCount].PointFeaturesInRedLine;
                        if (feats[0].Dataset.Caption.Contains(layerName))
                        {
                            for (int n = 0; n < feats.Length; n++)
                            {
                                DataRow pointRow = dataTable.NewRow();
                                pointRow[0] = feats[n].Dataset.Caption;
                                pointRow[1] = feats[n].GetFieldAsString("编号");
                                dataTable.Rows.Add(pointRow);
                            }
                        }
                    }
                }

                if (!sheetNameList.Contains(layerName))
                {
                    sheet.Name = layerName;
                    sheetNameList.Add(layerName);
                }
                else
                {
                    sheet.Name = layerName + "1";
                    sheetNameList.Add(layerName + "1");
                }

                for (int i = 0; i < dataTable.Columns.Count; i++)
                {
                    sheet.Cells[1, i + 1] = dataTable.Columns[i].ColumnName;
                }

                //填充数据
                for (int i = 0; i < dataTable.Rows.Count; i++) //所要添加的行数
                {
                    for (int j = 0; j < dataTable.Columns.Count; j++) //每行的列数
                    {
                        sheet.Cells[i + 2, j + 1] = dataTable.Rows[i][j].ToString(); //将数据填充到对应的单元格中
                    }
                }

                sheetStype(sheet, dataTable);

            }

            if (File.Exists(strSaveFile))
            {
                int z = 1;
                do
                {
                    strSaveFile = Path.Combine(Path.GetDirectoryName(strSaveFile) + "\\" + Path.GetFileNameWithoutExtension(strSaveFile) + z + ".xlsx");
                    z++;
                } while (File.Exists(strSaveFile));
            }
            workbook.SaveAs(strSaveFile, miss, miss, miss, miss, miss, XlSaveAsAccessMode.xlNoChange, miss, miss, miss);
            workbook.Close(false, miss, miss); //关闭表格
            workbooks.Close();
            excel.Quit();//释放资源
        }

       static void sheetStype(Worksheet sheet,DataGridView dataTable)
        {
            Range er = sheet.Range[sheet.Cells[1, 1], sheet.Cells[1, dataTable.Columns.Count]];//设置列标题的背景颜色
            int rowscount = dataTable.Rows.Count;//重新选择单元格范围
            int columncount = dataTable.Columns.Count;
            er = sheet.Range[sheet.Cells[1, 1], sheet.Cells[rowscount, 1]];//将范围重新确定为每一行的第一个单元格
            er = sheet.Range[sheet.Cells[1, 1], sheet.Cells[rowscount + 1, columncount + 1]];//选中EXCEL所有表格
            er.EntireColumn.AutoFit();//让EXCEL中的所有单元格的列宽碎文字的长短自动调整
            er.HorizontalAlignment = XlHAlign.xlHAlignCenter;// 让EXCEL的文本水平居中方式
        }

       static void sheetStype(Worksheet sheet, DataTable dataTable)
       {
           Range er = sheet.Range[sheet.Cells[1, 1], sheet.Cells[1, dataTable.Columns.Count]];//设置列标题的背景颜色
           int rowscount = dataTable.Rows.Count;//重新选择单元格范围
           int columncount = dataTable.Columns.Count;
           er = sheet.Range[sheet.Cells[1, 1], sheet.Cells[rowscount, 1]];//将范围重新确定为每一行的第一个单元格
           er = sheet.Range[sheet.Cells[1, 1], sheet.Cells[rowscount + 1, columncount + 1]];//选中EXCEL所有表格
           er.EntireColumn.AutoFit();//让EXCEL中的所有单元格的列宽碎文字的长短自动调整
           er.HorizontalAlignment = XlHAlign.xlHAlignCenter;// 让EXCEL的文本水平居中方式
       }
        /// <summary>
        /// 杀死进程
        /// </summary>
        /// <param name="app"></param>
         private static void KillProcess(Application app)  
       {  
           IntPtr t = new IntPtr(app.Hwnd);  
           int k = 0;  
           GetWindowThreadProcessId(t, out k);  
           Process p = Process.GetProcessById(k);  
           p.Kill();  
      }  

         [DllImport("User32.dll", CharSet = CharSet.Auto)]  
      public static extern int GetWindowThreadProcessId(IntPtr hwnd, out   int ID);



    }
}