可以调用控件例如FlexCell,不过这个要花钱买的,共享版不好用.

解决方案 »

  1.   

    using System;
    using System.Data;
    using Excel;namespace LogicLayer
    {
     /// <summary>
     /// OutputExcel 的摘要说明
     /// </summary>
     public class OutputExcel
     {
      public OutputExcel(DataView dv,string str)
      {
       //
       // TODO: 在此处添加构造函数逻辑
       //
       Excel.Application excel;
       int rowIndex=4;
       int colIndex=1;   Excel._Workbook xBk;
       Excel._Worksheet xSt;   excel= new Excel.ApplicationClass();;
       xBk = excel.Workbooks.Add(true);
       xSt = (Excel._Worksheet)xBk.ActiveSheet;   //
       //取得标题
       //
       foreach(DataColumn col in dv.Table.Columns)
       {
        colIndex++;
        excel.Cells[4,colIndex] = col.ColumnName;
        xSt.get_Range(excel.Cells[4,colIndex],excel.Cells[4,colIndex]).HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter;//设置标题格式为居中对齐
       }   //
       //取得表格中的数据
       //
       foreach(DataRowView row in dv)
       {
        rowIndex ++;
        colIndex = 1;
        foreach(DataColumn col in dv.Table.Columns)
        {
         colIndex ++;
         if(col.DataType == System.Type.GetType("System.DateTime"))
         {
          excel.Cells[rowIndex,colIndex] = (Convert.ToDateTime(row[col.ColumnName].ToString())).ToString("yyyy-MM-dd");
          xSt.get_Range(excel.Cells[rowIndex,colIndex],excel.Cells[rowIndex,colIndex]).HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter;//设置日期型的字段格式为居中对齐
         }
         else
         if(col.DataType == System.Type.GetType("System.String"))
         {
          excel.Cells[rowIndex,colIndex] = "'"+row[col.ColumnName].ToString();
          xSt.get_Range(excel.Cells[rowIndex,colIndex],excel.Cells[rowIndex,colIndex]).HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter;//设置字符型的字段格式为居中对齐
         }
         else
         {
          excel.Cells[rowIndex,colIndex] = row[col.ColumnName].ToString();
         }
        }
       }
       //
       //加载一个合计行
       //
       int rowSum = rowIndex + 1;
       int colSum = 2;
       excel.Cells[rowSum,2] = "合计";
       xSt.get_Range(excel.Cells[rowSum,2],excel.Cells[rowSum,2]).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
       //
       //设置选中的部分的颜色
       //
       xSt.get_Range(excel.Cells[rowSum,colSum],excel.Cells[rowSum,colIndex]).Select();
       xSt.get_Range(excel.Cells[rowSum,colSum],excel.Cells[rowSum,colIndex]).Interior.ColorIndex = 19;//设置为浅黄色,共计有56种
       //
       //取得整个报表的标题
       //
       excel.Cells[2,2] = str;
       //
       //设置整个报表的标题格式
       //
       xSt.get_Range(excel.Cells[2,2],excel.Cells[2,2]).Font.Bold = true;
       xSt.get_Range(excel.Cells[2,2],excel.Cells[2,2]).Font.Size = 22;
       //
       //设置报表表格为最适应宽度
       //
       xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,colIndex]).Select();
       xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,colIndex]).Columns.AutoFit();
       //
       //设置整个报表的标题为跨列居中
       //
       xSt.get_Range(excel.Cells[2,2],excel.Cells[2,colIndex]).Select();
       xSt.get_Range(excel.Cells[2,2],excel.Cells[2,colIndex]).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenterAcrossSelection;
       //
       //绘制边框
       //
       xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,colIndex]).Borders.LineStyle = 1;
       xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,2]).Borders[Excel.XlBordersIndex.xlEdgeLeft].Weight = Excel.XlBorderWeight.xlThick;//设置左边线加粗
       xSt.get_Range(excel.Cells[4,2],excel.Cells[4,colIndex]).Borders[Excel.XlBordersIndex.xlEdgeTop].Weight = Excel.XlBorderWeight.xlThick;//设置上边线加粗
       xSt.get_Range(excel.Cells[4,colIndex],excel.Cells[rowSum,colIndex]).Borders[Excel.XlBordersIndex.xlEdgeRight].Weight = Excel.XlBorderWeight.xlThick;//设置右边线加粗
       xSt.get_Range(excel.Cells[rowSum,2],excel.Cells[rowSum,colIndex]).Borders[Excel.XlBordersIndex.xlEdgeBottom].Weight = Excel.XlBorderWeight.xlThick;//设置下边线加粗
       //
       //显示效果
       //
       excel.Visible=true;
      }
     }
    }
      

  2.   

    //取得整个报表的标题
       //
       excel.Cells[2,2] = str;
       //
       //设置整个报表的标题格式
       //
       xSt.get_Range(excel.Cells[2,2],excel.Cells[2,2]).Font.Bold = true;
       xSt.get_Range(excel.Cells[2,2],excel.Cells[2,2]).Font.Size = 22;
       //
       //设置报表表格为最适应宽度
       //
       xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,colIndex]).Select();
       xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,colIndex]).Columns.AutoFit();
       //
       //设置整个报表的标题为跨列居中
       //
       xSt.get_Range(excel.Cells[2,2],excel.Cells[2,colIndex]).Select();
       xSt.get_Range(excel.Cells[2,2],excel.Cells[2,colIndex]).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenterAcrossSelection;
    这些都是对EXCEL操作的
      

  3.   

    可以用M$的一些基础控件进行模拟!简单说就是在某个Cell得到焦点然后用一个TextBox遮住这个Cell以实现编辑!
      

  4.   

    看看我写的FlexCell,有很多功能是模仿Excel来做的:http://www.grid2000.com/cn/index.html
      

  5.   

    vb.net写的一个完整的Excel控件:http://www.winfarsoft.com/richcell.exe,对写表格控件有兴趣的朋友我们可以一起讨论,比如写表格控件的思路、技巧等。
      

  6.   

    我的想法是如何自己绘制比较简单的表格,能实现基本的文字和数值输入即可,但是还是没有思路,如果把每个表格作为一个EDIT控件,可能开销太大了。如果自己绘制,但焦点和文字输入以及表格调整后文字的换行,如何处理,恳请各位给个大概的实现思路
      

  7.   

    可以自己绘制!
    只用一个EDIT进行输入就可以了!
    可以参考DELPHI的TStringGrid!
    原理差不多!
      

  8.   

    谢谢大家,我的做法看看可不可以,建立一个CELL类,并建立对应的鼠标、键盘的事件。在控件中对这些CELL进行扫描,当鼠标点饥到某个CELL时,该CELL得到焦点,键盘输入时该CELL执行相应的输入,以及显示插入符。这样的方法大致可行,但是我担心如果有很多CELL时,控件需对所有的CELL进行扫描,以及建立很多的CELL会不会开销很大,请大家指教。