• C#-几种读取csv文件并导出excel的方式


    1、读取路径按钮

    private void button1_Click(object sender, EventArgs e)//选取文件
            {
                OpenFileDialog openFileDialog1 = new OpenFileDialog();
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    if (openFileDialog1.FileName != "")
                    {
                        this.textBox1.Text = openFileDialog1.FileName;
                    }
                }
            }

    2、根据路径读取csv文件值datatable

    class Csv2DT
        {
            /// <summary>
            /// 将Csv读入DataTable
            /// </summary>
            /// <param name="filePath">csv文件路径</param>
            /// <param name="n">表示第n行是字段title,第n+1行是记录开始</param>
            /// <param name="k">可选参数表示最后K行不算记录默认0</param>
            public static DataTable csv2dt(string filePath, int n, DataTable dt) //这个dt 是个空白的没有任何行列的DataTable
            {
                String csvSplitBy = "(?<=^|,)("(?:[^"]|"")*"|[^,]*)";
                StreamReader reader = new StreamReader(filePath, System.Text.Encoding.Default, false);
                int i = 0, m = 0;
                reader.Peek();
                while (reader.Peek() > 0)
                {
                    m = m + 1;
                    string str = reader.ReadLine();
                    if (m >= n + 1)
                    {
                        if (m == n + 1) //如果是字段行,则自动加入字段。
                        {
                            MatchCollection mcs = Regex.Matches(str, csvSplitBy);
                            foreach (Match mc in mcs)
                            {
                                dt.Columns.Add(mc.Value); //增加列标题
                            }
                        }
                        else
                        {
                            MatchCollection mcs = Regex.Matches(str, "(?<=^|,)("(?:[^"]|"")*"|[^,]*)");
                            i = 0;
                            System.Data.DataRow dr = dt.NewRow();
                            foreach (Match mc in mcs)
                            {
                                dr[i] = mc.Value;
                                i++;
                            }
                            dt.Rows.Add(dr);  //DataTable 增加一行     
                        }
                    }
                }
                return dt;
            }
         }

    3、从datagridview取数导出excel

    class microsoftoutputexcel
        {
            public static void outexcel(DataGridView dataGridView1)
            {
                string fileName = "";
    
                string saveFileName = "";
    
                SaveFileDialog saveDialog = new SaveFileDialog();
    
                saveDialog.DefaultExt = "xls";
    
                saveDialog.Filter = "Excel(*.xls)|*.xls|Excel(2007-2016)(*.xlsx)|*.xlsx";
    
                saveDialog.FileName = fileName;
    
                saveDialog.ShowDialog();
    
                saveFileName = saveDialog.FileName;
    
                if (saveFileName.IndexOf(":") < 0) return; //被点了取消
    
                Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
    
                if (xlApp == null)
    
                {
    
                    MessageBox.Show("无法创建Excel对象,您的电脑可能未安装Excel");
    
                    return;
    
                }
    
                Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;
    
                Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
    
                Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];//取得sheet1 
    
                //写入标题             
    
                for (int i = 0; i < dataGridView1.ColumnCount; i++)
    
                { worksheet.Cells[1, i + 1] = dataGridView1.Columns[i].HeaderText; }
    
                //写入数值
    
                for (int r = 0; r < dataGridView1.Rows.Count; r++)
    
                {
                    for (int i = 0; i < dataGridView1.ColumnCount; i++)
    
                    {
    
                        worksheet.Cells[r + 2, i + 1] = dataGridView1.Rows[r].Cells[i].Value;
    
                    }
    
                    System.Windows.Forms.Application.DoEvents();
    
                }
    
                worksheet.Columns.EntireColumn.AutoFit();//列宽自适应
    
                MessageBox.Show(fileName + "资料保存成功", "提示", MessageBoxButtons.OK);
    
                if (saveFileName != "")
    
                {
    
                    try
    
                    {
                        workbook.Saved = true;
    
                        workbook.SaveCopyAs(saveFileName);  //fileSaved = true;                 
    
                    }
    
                    catch (Exception ex)
    
                    {//fileSaved = false;                      
    
                        MessageBox.Show("导出文件时出错,文件可能正被打开!
    " + ex.Message);
    
                    }
    
                }
    
                xlApp.Quit();
    
                GC.Collect();//强行销毁           }
    
            }
        }

    4、从datatable取数导出excel(1)

    class datatable2excel
        {
            public static void DataTabletoExcel(System.Data.DataTable tmpDataTable, string strFileName)
    
            {
    
                if (tmpDataTable == null)
    
                    return;
    
                int rowNum = tmpDataTable.Rows.Count;
    
                int columnNum = tmpDataTable.Columns.Count;
    
                int rowIndex = 1;
    
                int columnIndex = 0;
    
    
    
                Microsoft.Office.Interop.Excel.Application xlApp = new ApplicationClass();
                xlApp.DefaultFilePath = "";
    
                xlApp.DisplayAlerts = true;
    
                xlApp.SheetsInNewWorkbook = 1;
    
                Workbook xlBook = xlApp.Workbooks.Add(true);
    
    
    
                //将DataTable的列名导入Excel表第一行
    
                foreach (DataColumn dc in tmpDataTable.Columns)
    
                {
    
                    columnIndex++;
    
                    xlApp.Cells[rowIndex, columnIndex] = dc.ColumnName;
    
                }
    
    
    
                //将DataTable中的数据导入Excel中
    
                for (int i = 0; i < rowNum; i++)
    
                {
    
                    rowIndex++;
    
                    columnIndex = 0;
    
                    for (int j = 0; j < columnNum; j++)
    
                    {
    
                        columnIndex++;
    
                        xlApp.Cells[rowIndex, columnIndex] = tmpDataTable.Rows[i][j].ToString();
    
                    }
    
                }
    
                //xlBook.SaveCopyAs(HttpUtility.UrlDecode(strFileName, System.Text.Encoding.UTF8));
    
                xlBook.SaveCopyAs(strFileName);
    
            }
    
        }

    5、从datatable取数导出excel(2)

    class finallyoutexcel
        {
            /// <summary>
            /// 将DataTable数据导出到Excel表
            /// </summary>
            /// <param name="tmpDataTable">要导出的DataTable</param>
            /// <param name="strFileName">Excel的保存路径及名称</param>
            public  void DataTabletoExcel(System.Data.DataTable tmpDataTable, string strFileName)
            {
                if (tmpDataTable == null)
                {
                    return;
                }
                long rowNum = tmpDataTable.Rows.Count;//行数
                int columnNum = tmpDataTable.Columns.Count;//列数
                Microsoft.Office.Interop.Excel.Application m_xlApp = new Microsoft.Office.Interop.Excel.Application();
                m_xlApp.DisplayAlerts = false;//不显示更改提示
                m_xlApp.Visible = false;
                Microsoft.Office.Interop.Excel.Workbooks workbooks = m_xlApp.Workbooks;
                Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
                Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];//取得sheet1
                try
                {
                    if (rowNum > 65536)//单张Excel表格最大行数
                    {
                        long pageRows = 65535;//定义每页显示的行数,行数必须小于65536
                        int scount = (int)(rowNum / pageRows);//导出数据生成的表单数
                        if (scount * pageRows < rowNum)//当总行数不被pageRows整除时,经过四舍五入可能页数不准
                        {
                            scount = scount + 1;
                        }
                        for (int sc = 1; sc <= scount; sc++)
                        {
                            if (sc > 1)
                            {
                                object missing = System.Reflection.Missing.Value;
                                worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets.Add(
                                missing, missing, missing, missing);//添加一个sheet
                            }
                            else
                            {
                                worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[sc];//取得sheet1
                            }
                            string[,] datas = new string[pageRows + 1, columnNum];
                            for (int i = 0; i < columnNum; i++) //写入字段
                            {
                                datas[0, i] = tmpDataTable.Columns[i].Caption;//表头信息
                            }
                            Microsoft.Office.Interop.Excel.Range range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, columnNum]);
                            range.Interior.ColorIndex = 15;//15代表灰色
                            range.Font.Bold = true;
                            range.Font.Size = 9;
                            int init = int.Parse(((sc - 1) * pageRows).ToString());
                            int r = 0;
                            int index = 0;
                            int result;
                            if (pageRows * sc >= rowNum)
                            {
                                result = (int)rowNum;
                            }
                            else
                            {
                                result = int.Parse((pageRows * sc).ToString());
                            }
                            for (r = init; r < result; r++)
                            {
                                index = index + 1;
                                for (int i = 0; i < columnNum; i++)
                                {
                                    object obj = tmpDataTable.Rows[r][tmpDataTable.Columns[i].ToString()];
                                    datas[index, i] = obj == null ? "" : "'" + obj.ToString().Trim();//在obj.ToString()前加单引号是为了防止自动转化格式
                                }
                                System.Windows.Forms.Application.DoEvents();
                                //添加进度条
                            }
                            Microsoft.Office.Interop.Excel.Range fchR = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[index + 1, columnNum]);
                            fchR.Value2 = datas;
                            worksheet.Columns.EntireColumn.AutoFit();//列宽自适应。
                            m_xlApp.WindowState = Microsoft.Office.Interop.Excel.XlWindowState.xlMaximized;//Sheet表最大化
                            range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[index + 1, columnNum]);
                            //range.Interior.ColorIndex = 15;//15代表灰色
                            range.Font.Size = 9;
                            range.RowHeight = 14.25;
                            range.Borders.LineStyle = 1;
                            range.HorizontalAlignment = 1;
                        }
                    }
                    else
                    {
                        string[,] datas = new string[rowNum + 1, columnNum];
                        for (int i = 0; i < columnNum; i++) //写入字段
                        {
                            datas[0, i] = tmpDataTable.Columns[i].Caption;
                        }
                        Microsoft.Office.Interop.Excel.Range range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, columnNum]);
                        range.Interior.ColorIndex = 15;//15代表灰色
                        range.Font.Bold = true;
                        range.Font.Size = 9;
                        int r = 0;
                        for (r = 0; r < rowNum; r++)
                        {
                            for (int i = 0; i < columnNum; i++)
                            {
                                object obj = tmpDataTable.Rows[r][tmpDataTable.Columns[i].ToString()];
                                datas[r + 1, i] = obj == null ? "" : "'" + obj.ToString().Trim();//在obj.ToString()前加单引号是为了防止自动转化格式
                            }
                            System.Windows.Forms.Application.DoEvents();
                            //添加进度条
                        }
                        Microsoft.Office.Interop.Excel.Range fchR = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[rowNum + 1, columnNum]);
                        fchR.Value2 = datas;
                        worksheet.Columns.EntireColumn.AutoFit();//列宽自适应。
                        m_xlApp.WindowState = Microsoft.Office.Interop.Excel.XlWindowState.xlMaximized;
                        range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[rowNum + 1, columnNum]);
                        //range.Interior.ColorIndex = 15;//15代表灰色
                        range.Font.Size = 9;
                        range.RowHeight = 14.25;
                        range.Borders.LineStyle = 1;
                        range.HorizontalAlignment = 1;
                    }
                    workbook.Saved = true;
                    workbook.SaveCopyAs(strFileName);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("导出异常:" + ex.Message, "导出异常", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                finally
                {
                    EndReport(m_xlApp);
                }
            }
            /// <summary>
            /// 退出报表时关闭Excel和清理垃圾Excel进程
            /// </summary>
            private void EndReport(Microsoft.Office.Interop.Excel.Application m_xlApp)
            {
                object missing = System.Reflection.Missing.Value;
                try
                {
                    m_xlApp.Workbooks.Close();
                    m_xlApp.Workbooks.Application.Quit();
                    m_xlApp.Application.Quit();
                    m_xlApp.Quit();
                }
                catch { }
                finally
                {
                    try
                    {
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(m_xlApp.Workbooks);
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(m_xlApp.Application);
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(m_xlApp);
                        m_xlApp = null;
                    }
                    catch { }
                    try
                    {
                        //清理垃圾进程
                        this.killProcessThread();
                    }
                    catch { }
                    GC.Collect();
                }
            }
            /// <summary>
            /// 杀掉不死进程
            /// </summary>
            private void killProcessThread()
            {
                ArrayList myProcess = new ArrayList();
                for (int i = 0; i < myProcess.Count; i++)
                {
                    try
                    {
                        System.Diagnostics.Process.GetProcessById(int.Parse((string)myProcess[i])).Kill();
                    }
                    catch { }
                }
            }
        }

    6、从datatable取数导出excel(3)

    class finallyoutexcel1
        {
            /// <summary>
            /// 将DataTable数据导出到Excel表
            /// </summary>
            /// <param name="tmpDataTable">要导出的DataTable</param>
            /// <param name="strFileName">Excel的保存路径及名称</param>
            public void DataTabletoExcel(System.Data.DataTable tmpDataTable, string strFileName)
            {
                if (tmpDataTable == null)
                {
                    return;
                }
                long rowNum = tmpDataTable.Rows.Count;//行数
                int columnNum = tmpDataTable.Columns.Count;//列数
                Microsoft.Office.Interop.Excel.Application m_xlApp = new Microsoft.Office.Interop.Excel.Application();
                m_xlApp.DisplayAlerts = false;//不显示更改提示
                m_xlApp.Visible = false;
                Microsoft.Office.Interop.Excel.Workbooks workbooks = m_xlApp.Workbooks;
                Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
                Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];//取得sheet1
                try
                {
                    if (rowNum > 65536)//单张Excel表格最大行数
                    {
                        long pageRows = 65535;//定义每页显示的行数,行数必须小于65536
                        int scount = (int)(rowNum / pageRows);//导出数据生成的表单数
                        if (scount * pageRows < rowNum)//当总行数不被pageRows整除时,经过四舍五入可能页数不准
                        {
                            scount = scount + 1;
                        }
                        for (int sc = 1; sc <= scount; sc++)
                        {
                            if (sc > 1)
                            {
                                object missing = System.Reflection.Missing.Value;
                                worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets.Add(
                                missing, missing, missing, missing);//添加一个sheet
                            }
                            else
                            {
                                worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[sc];//取得sheet1
                            }
                            string[,] datas = new string[pageRows + 1, columnNum];
                            for (int i = 0; i < columnNum; i++) //写入字段
                            {
                                datas[0, i] = tmpDataTable.Columns[i].Caption;//表头信息
                            }
                            Microsoft.Office.Interop.Excel.Range range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, columnNum]);
                            range.Interior.ColorIndex = 15;//15代表灰色
                            range.Font.Bold = true;
                            range.Font.Size = 9;
                            int init = int.Parse(((sc - 1) * pageRows).ToString());
                            int r = 0;
                            int index = 0;
                            int result;
                            if (pageRows * sc >= rowNum)
                            {
                                result = (int)rowNum;
                            }
                            else
                            {
                                result = int.Parse((pageRows * sc).ToString());
                            }
                            for (r = init; r < result; r++)
                            {
                                index = index + 1;
                                for (int i = 0; i < columnNum; i++)
                                {
                                    object obj = tmpDataTable.Rows[r][tmpDataTable.Columns[i].ToString()];
                                    datas[index, i] = obj == null ? "" : "'" + obj.ToString().Trim();//在obj.ToString()前加单引号是为了防止自动转化格式
                                }
                                System.Windows.Forms.Application.DoEvents();
                                //添加进度条
                            }
                            Microsoft.Office.Interop.Excel.Range fchR = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[index + 1, columnNum]);
                            fchR.Value2 = datas;
                            worksheet.Columns.EntireColumn.AutoFit();//列宽自适应。
                            m_xlApp.WindowState = Microsoft.Office.Interop.Excel.XlWindowState.xlMaximized;//Sheet表最大化
                            range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[index + 1, columnNum]);
                            //range.Interior.ColorIndex = 15;//15代表灰色
                            range.Font.Size = 9;
                            range.RowHeight = 14.25;
                            range.Borders.LineStyle = 1;
                            range.HorizontalAlignment = 1;
                        }
                    }
                    else
                    {
                        string[,] datas = new string[rowNum + 1, columnNum];
                        for (int i = 0; i < columnNum; i++) //写入字段
                        {
                            datas[0, i] = tmpDataTable.Columns[i].Caption;
                        }
                        Microsoft.Office.Interop.Excel.Range range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, columnNum]);
                        range.Interior.ColorIndex = 15;//15代表灰色
                        range.Font.Bold = true;
                        range.Font.Size = 9;
                        int r = 0;
                        for (r = 0; r < rowNum; r++)
                        {
                            for (int i = 0; i < columnNum; i++)
                            {
                                object obj = tmpDataTable.Rows[r][tmpDataTable.Columns[i].ToString()];
                                string str1 = obj.ToString();
                                    datas[r + 1, i] = obj == null ? "" : "'" + obj.ToString().Trim();//在obj.ToString()前加单引号是为了防止自动转化格式
                            }
                            System.Windows.Forms.Application.DoEvents();
                            //添加进度条
                        }
                        Microsoft.Office.Interop.Excel.Range fchR = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[rowNum + 1, columnNum]);
                        fchR.Value2 = datas;
                        worksheet.Columns.EntireColumn.AutoFit();//列宽自适应。
                        m_xlApp.WindowState = Microsoft.Office.Interop.Excel.XlWindowState.xlMaximized;
                        range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[rowNum + 1, columnNum]);
                        //range.Interior.ColorIndex = 15;//15代表灰色
                        range.Font.Size = 9;
                        range.RowHeight = 14.25;
                        range.Borders.LineStyle = 1;
                        range.HorizontalAlignment = 1;
                    }
                    workbook.Saved = true;
                    workbook.SaveCopyAs(strFileName);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("导出异常:" + ex.Message, "导出异常", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                finally
                {
                    EndReport(m_xlApp);
                }
            }
            /// <summary>
            /// 退出报表时关闭Excel和清理垃圾Excel进程
            /// </summary>
            private void EndReport(Microsoft.Office.Interop.Excel.Application m_xlApp)
            {
                object missing = System.Reflection.Missing.Value;
                try
                {
                    m_xlApp.Workbooks.Close();
                    m_xlApp.Workbooks.Application.Quit();
                    m_xlApp.Application.Quit();
                    m_xlApp.Quit();
                }
                catch { }
                finally
                {
                    try
                    {
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(m_xlApp.Workbooks);
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(m_xlApp.Application);
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(m_xlApp);
                        m_xlApp = null;
                    }
                    catch { }
                    try
                    {
                        //清理垃圾进程
                        this.killProcessThread();
                    }
                    catch { }
                    GC.Collect();
                }
            }
            /// <summary>
            /// 杀掉不死进程
            /// </summary>
            private void killProcessThread()
            {
                ArrayList myProcess = new ArrayList();
                for (int i = 0; i < myProcess.Count; i++)
                {
                    try
                    {
                        System.Diagnostics.Process.GetProcessById(int.Parse((string)myProcess[i])).Kill();
                    }
                    catch { }
                }
            }
        }

  • 相关阅读:
    $Poj2228$/洛谷$SP283 Naptime$ 环形$DP$
    $Poj1952 $洛谷$1687 Buy Low,Buy Lower$ 线性$DP+$方案计数
    $Poj3585 Accumulation Degree$ 树形$DP/$二次扫描与换根法
    洛谷$1541$ 乌龟棋 线性$DP$
    $Loj10157$ 皇宫看守 树形$DP$
    $loj10156/$洛谷$2016$ 战略游戏 树形$DP$
    $Loj10155$ 数字转换(求树的最长链) 树形$DP$
    洛谷$2015$二叉苹果树
    $CH5302$ 金字塔 区间$DP$/计数类$DP$
    [hiho1035] 自驾旅行III
  • 原文地址:https://www.cnblogs.com/BruceKing/p/13183394.html
Copyright © 2020-2023  润新知