使用C#和Excel进行报表开发(八)-用程序绑定数据源

转载 2007年09月30日 10:09:00

本文演示一个简单的办法,并使用程序将一个dataset中的内容填充到指定的格子中,目的是尽可能的通用,从而避免C#代码必须知道Excel文件中字段和内容的位置的情况。

先制作一个简单的Excel文件作为模板,为了防止要填充的Cell中的内容和标题的内容一样,所以要填充内容的Cell中的内容是“$” + 字段名(要和DataTable中的列名一致),效果如图:

创建一个Winform程序,给窗体上添加两个按钮,代码分别为:
创建Xml:

private void button1_Click(object sender, EventArgs e)
        
{
            DataColumn dcName 
= new DataColumn("name"typeof(string));
            DataColumn dcAge 
= new DataColumn("age"typeof(int));
            DataColumn dcMemo 
= new DataColumn("memo"typeof(string));

            DataTable dt 
= new DataTable();
            dt.Columns.Add(dcName);
            dt.Columns.Add(dcAge);
            dt.Columns.Add(dcMemo);

            DataRow dr 
= dt.NewRow();
            dr[
"name"= "dahuzizyd";
            dr[
"age"= "20";
            dr[
"memo"= "dahuzizyd.cnblogs.com";

            dt.Rows.Add(dr);
            dt.AcceptChanges();

            DataSet ds 
= new DataSet();
            ds.Tables.Add(dt);

            ds.WriteXml(Application.StartupPath 
+"//ExcelBindingXml.xml");


        }



提取xml并且加载到Excel模板上,再另存:

 

private void button2_Click(object sender, EventArgs e)
        
{
            DataSet ds 
= new DataSet();
            ds.ReadXml(Application.StartupPath 
+ "//ExcelBindingXml.xml");

            Excel.Application m_objExcel 
= null;

            Excel._Workbook m_objBook 
= null;

            Excel.Sheets m_objSheets 
= null;

            Excel._Worksheet m_objSheet 
= null;

            Excel.Range m_objRange 
= null;

            
object m_objOpt = System.Reflection.Missing.Value;

            
try
            
{

                m_objExcel 
= new Excel.Application();
                m_objBook 
= m_objExcel.Workbooks.Open(Application.StartupPath + "//ExcelTemplate.xls", m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
                m_objSheets 
= (Excel.Sheets)m_objBook.Worksheets;
                m_objSheet 
= (Excel._Worksheet)(m_objSheets.get_Item(1));

                
foreach (DataRow dr in ds.Tables[0].Rows)
                
{
                    
for (int col = 0; col < ds.Tables[0].Columns.Count; col++)
                    
{
                        
for (int excelcol = 1; excelcol < 8; excelcol++)
                        
{
                            
for (int excelrow = 1; excelrow < 5; excelrow++)
                            
{
                                
string excelColName = ExcelColNumberToColText(excelcol);
                                
                                m_objRange 
= m_objSheet.get_Range(excelColName + excelrow.ToString(), m_objOpt);

                                
if ( m_objRange.Text.ToString().Replace("$",""== ds.Tables[0].Columns[col].ColumnName )
                                
{
                                    m_objRange.Value2 
= dr[col].ToString();
                                }

                            }


                        }

                    }

                }

                
                m_objExcel.DisplayAlerts 
= false;
                m_objBook.SaveAs(Application.StartupPath 
+ "//ExcelBindingXml.xls", m_objOpt, m_objOpt,
                m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange,

                                                m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);

            }

            
catch (Exception ex)
            
{
                MessageBox.Show(ex.Message);
            }

            
finally
            
{
                m_objBook.Close(m_objOpt, m_objOpt, m_objOpt);
                m_objExcel.Workbooks.Close();
                m_objExcel.Quit();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objBook);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objExcel);
                m_objBook 
= null;
                m_objExcel 
= null;
                GC.Collect();
            }

        }


下面是一个辅助函数,主要是将整数的列序号转换到Excel用的以字母表示的列号,Excel最大列数为255。

private string ExcelColNumberToColText(int colNumber)
        
{
            
string colText = "";

            
int colTextLength = colNumber / 26;
            
int colTextLast = colNumber % 26;

            
if (colTextLast != 0)
            
{
                
switch (colTextLength)
                
{
                    
case 0break;
                    
case 1: colText = "A"break;
                    
case 2: colText = "B"break;
                    
case 3: colText = "C"break;
                    
case 4: colText = "D"break;
                    
case 5: colText = "E"break;
                    
case 6: colText = "F"break;
                    
case 7: colText = "G"break;
                    
case 8: colText = "H"break;
                    
case 9: colText = "I"break;
                    
defaultbreak;
                }

            }

            
else
            
{
                
switch (colTextLength)
                
{
                    
case 1: colText = ""break;
                    
case 2: colText = "A"break;
                    
case 3: colText = "B"break;
                    
case 4: colText = "C"break;
                    
case 5: colText = "D"break;
                    
case 6: colText = "E"break;
                    
case 7: colText = "F"break;
                    
case 8: colText = "G"break;
                    
case 9: colText = "H"break;
                    
defaultbreak;
                }

            }

            
            
switch (colTextLast)
            
{
                
case 0:colText = colText + "Z"break;
                
case 1: colText = colText + "A"break;
                
case 2: colText = colText + "B"break;
                
case 3: colText = colText + "C"break;
                
case 4: colText = colText + "D"break;
                
case 5: colText = colText + "E"break;
                
case 6: colText = colText + "F"break;
                
case 7: colText = colText + "G"break;
                
case 8: colText = colText + "H"break;
                
case 9: colText = colText + "I"break;
                
case 10: colText = colText + "J"break;
                
case 11: colText = colText + "K"break;
                
case 12: colText = colText + "L"break;
                
case 13: colText = colText + "M"break;
                
case 14: colText = colText + "N"break;
                
case 15: colText = colText + "O"break;
                
case 16: colText = colText + "P"break;
                
case 17: colText = colText + "Q"break;
                
case 18: colText = colText + "R"break;
                
case 19: colText = colText + "S"break;
                
case 20: colText = colText + "T"break;
                
case 21: colText = colText + "U"break;
                
case 22: colText = colText + "V"break;
                
case 23: colText = colText + "W"break;
                
case 24: colText = colText + "X"break;
                
case 25: colText = colText + "Y"break;
                
                
defaultbreak;
            }


            
return colText;
        }

运行完成后,生成的Excel如下图:
 

使用C#和Excel进行报表开发(八)-用程序绑定数据源

本文演示一个简单的办法,并使用程序将一个dataset中的内容填充到指定的格子中,目的是尽可能的通用,从而避免C#代码必须知道Excel文件中字段和内容的位置的情况。 先制作一个简单的Excel...

使用C#和Excel进行报表开发(七)-设置单元格的显示格式

原文地址:http://www.cnblogs.com/dahuzizyd/archive/2007/04/11/CSharp_Excel_Report_Chart_All.html 整个系列均...

使用C#和Excel进行报表开发-生成统计图Chart

原文地址:http://www.opent.cn/a/094/1235.shtml有的Web项目选用Excel作为报表方案,在服务器端生成Excel文件,然后传送到客户端,由客户端进行打印。在国内的环...

使用C#和Excel进行报表开发(七)-设置单元格的显示格式

在Excel中,如果某个单元格的内容是数字,且比较长,默认情况下,会变为科学计数发表示,例如:123456789123456000会被表示为1.2345E+17,为了能够将数字按照普通的格式完全表示,...

VB.NET机房收费系统之报表制作(绑定数据源)(二)

报表制作完成,接下来继续优化。 第一行为列标题,第二行为数据关联行,即与数据库中数据的关联,鼠标放到第二行每个单元格时,单元格右上角会出现一个小图标,点击则可以为该单元格以及该单元格所在的整列关联数据...
  • ght886
  • ght886
  • 2017年12月02日 18:19
  • 79

VB.NET机房收费系统之报表制作(绑定数据源)(一)

这次机房重构用的Visual Studio 2015。在机房结账环节,我们会用到报表。下面来详细介绍报表制作过程。 首先先查看VS里面有没有Reporting (报表项目)。 如果没有,就再次安装...
  • ght886
  • ght886
  • 2017年12月02日 17:48
  • 37

RDLC绑定本地数据源示例程序

  • 2016年01月28日 14:15
  • 321KB
  • 下载

WinForm程序用使用List对象绑定DataGridView数据源

1、 在用List对象绑定DataGridView数据源属性的时候,数据源的内容不会动态更新,如果List对象集合中的数据发生变化,那么数据控件的数据源是不会得到更新的。一般也不建议用List去填充数...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用C#和Excel进行报表开发(八)-用程序绑定数据源
举报原因:
原因补充:

(最多只允许输入30个字)