zoukankan      html  css  js  c++  java
  • C# 读带复选框的excel,写excel并设置字体、边框、背景色

    这是一篇excel读写功能大汇总,通过C#调用Microsoft.Office.Interop.Excel.dll才能完成任何复杂格式excel的读写操作。

    本文需要读取的excel格式如下:

    可见表格极不规则,且含有复选框等控件,现在需要将这种表格中的数据提取出来。

    要求将提取出来的数据写入到明细表结构的excel中,格式如:

    这是我们常见的table表样式,但需要操作excel的字体、背景颜色和边框样式。

    为完成以上工作,我们先引用Microsoft.Office.Interop.Excel.dll控件:

    程序中添加using引用:

    using Excel = Microsoft.Office.Interop.Excel;

    读取复杂excel格式数据的代码如下:

     private void GetData(string excelPath)
            {
                Excel.Application excelapp = new Excel.Application();
                Excel.Workbook wb = excelapp.Workbooks.Open(excelPath);
                Excel.Worksheet WS = (Excel.Worksheet)wb.Worksheets[1];
                Excel.CheckBoxes ckbs = (Excel.CheckBoxes)WS.CheckBoxes(Type.Missing);
    
                //读取复选框的值
                //Excel.CheckBox cbt = (Excel.CheckBox)ckbs.Item(1);
                //MessageBox.Show(cbt.Value + " " + cbt.Caption);
    
                //读取单元格的值
                //MessageBox.Show(WS.Cells.get_Range("C2").Value);
    
                //读取excel数据到table中
                DataRow dr = resultDt.NewRow();
                dr.BeginEdit();
                dr["负责人"] = WS.Cells.get_Range("C2").Value;
                dr["所属区域"] = WS.Cells.get_Range("G2").Value;
                dr["填写时间"] = ((DateTime)WS.Cells.get_Range("K2").Value).ToShortDateString();
                dr["经销商姓名"] = WS.Cells.get_Range("C3").Value;
                dr["手机"] = WS.Cells.get_Range("E3").Value;
                dr["办公电话"] = WS.Cells.get_Range("H3").Value;
                dr["传真"] = WS.Cells.get_Range("K3").Value;
                dr["商业公司"] = WS.Cells.get_Range("C4").Value;
                //读取复选框的值
                dr["经销商性质"] = getCheckString(new int[] { 5, 6 }, ckbs);
                dr["销售渠道"] = getCheckString(new int[] { 7, 8, 9, 10 }, ckbs);
                dr["操作的主要区域"] = WS.Cells.get_Range("C6").Value;
                dr["分销的主要区域"] = WS.Cells.get_Range("I6").Value;
                dr["操作的主要医院"] = WS.Cells.get_Range("C7").Value;
                dr["经销商资金实力"] = getCheckString(new int[] { 1, 2, 3, 4 }, ckbs);
                dr["同行的评价"] = WS.Cells.get_Range("C9").Value;
                dr["专职医药代表人数"] = WS.Cells.get_Range("D10").Value;
                dr["市场推广专员人数"] = WS.Cells.get_Range("H10").Value;
                dr["销售主管姓名"] = WS.Cells.get_Range("L10").Value;
                //合并既往销售品种
                string hb = string.Empty;
                if (WS.Cells.get_Range("D11").Value!=null)
                    hb = WS.Cells.get_Range("D11").Value + "/" + WS.Cells.get_Range("H11").Value + "/" + WS.Cells.get_Range("L11").Value;
                if (WS.Cells.get_Range("D12").Value!=null)
                    hb += "" + WS.Cells.get_Range("D12").Value + "/" + WS.Cells.get_Range("H12").Value + "/" + WS.Cells.get_Range("L12").Value;
                if (WS.Cells.get_Range("D13").Value!=null)
                    hb += "" + WS.Cells.get_Range("D13").Value + "/" + WS.Cells.get_Range("H13").Value + "/" + WS.Cells.get_Range("L13").Value;
                dr["既往销售主要品种数量方式"] = hb;
                dr["销售推广的操作模式"] = WS.Cells.get_Range("D14").Value;
                dr["客户强项关系"] = getCheckString(new int[] { 11, 12, 13, 14, 15, 16, 17 }, ckbs);
                dr["政府事务主要关系"] = WS.Cells.get_Range("D16").Value;
                dr.EndEdit();
                resultDt.Rows.Add(dr);
    
                //dataGridView1.DataSource = resultDt.DefaultView;
    
                wb.Close();
                excelapp.Quit();
            }

    代码中已经很清楚了,特别强调的是,读取复选框的值比较麻烦一点,只有WS.CheckBoxes(Type.Missing)这个方法,直接得到excel中所有的checkbox,然后如何对应呢,如果checkbox是有text值,那还好一点,可以从text值来对应,如果复选框使用不规范,所有的复选框text属性都是空,那就麻烦了。真不巧我就是遇到一个这样的excel模板,于是先备份一份,然后在excel中把所有checkbox都添加上对应的text属性,然后在程序中遍历一下所有checkbox的index,这样就把index和text对应上了,再使用原先的模板,也不会去错值。

    excel格式再复杂,我们要取的数据都会在一个个单元格里面,只要我们用WS.Cells.get_Range("C2").Value方法取值,就可以取到任何单元格,任何复杂格式的数据。

    然后我们现在来看写操作,写excel有很多种方法,但要想控制excel的字体、边框、背景色等样式,就还是得用Microsoft.Office.Interop.Excel来完成。

    写excel的代码如下:

     string filesavePath = saveFileDialog1.FileName;
                    Excel.Application excel = new Excel.Application();
                    Excel.Workbook book = excel.Workbooks.Add(Type.Missing);
                    Excel.Worksheet sheet = (Excel.Worksheet)book.ActiveSheet;
                    // Adds table headers
                    for(int i=0;i<resultDt.Columns.Count;i++)
                    {
                        sheet.Cells[1, i + 1] = resultDt.Columns[i].ColumnName;
                        
                    }
                    sheet.Cells.get_Range("A1", "V1").Font.Bold = true; //设置字体为粗体
                    sheet.Cells.get_Range("A1", "V1").Font.Size = 14; //设置字体大小
                    sheet.Cells.get_Range("A1", "V1").EntireColumn.AutoFit();//自动调整列宽
                    sheet.Cells.get_Range("A1", "V1").EntireRow.AutoFit();//自动调整行高
                    sheet.Cells.get_Range("A1", "V1").Interior.Color = System.Drawing.ColorTranslator.ToOle(Color.Yellow);//设置背景色
                    sheet.Cells.get_Range("A1", "V" + (resultDt.Rows.Count+1)).Borders.LineStyle = 1; //设置整个数据区边框为实线
    
    
                    for (int row = 0; row < resultDt.Rows.Count; row++)
                    {
                        for (int col = 0; col < resultDt.Columns.Count; col++)
                        {
                            sheet.Cells[row + 2, col + 1] = resultDt.Rows[row][col].ToString();
                        }
                    }
    
                    book.Close(true, filesavePath, Type.Missing);
                    excel.Quit();
    
                    label2.Text = "已成功导出到文件:"+filesavePath;

    源码下载:  CODE

  • 相关阅读:
    看net2.0头晕眼花,是不是该做个具体的程序呢
    安装SQLServer2000时,提示"以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机"
    刚装的WIN7,用了一下午,记一下备忘
    不同系统开启和关闭fso的方法(转)
    希腊字母以及发音
    meta 标签的作用
    电信禁止路由上网的最佳破解方法(转)
    安装系统
    网络工程师笔记
    GHOST操作
  • 原文地址:https://www.cnblogs.com/tuyile006/p/3977177.html
Copyright © 2011-2022 走看看