问题如下:   我需要在Web页面显示Excel的WorkSheet(eg: 在Excel中有1,2,3  三个WorkSheet).在Web页面中我也需要显示这三个WorkSheet,并且顺序不能错.不能是1,3,2什么的.   我使用OleDB读取Excel信息,并且通过GetOleDbSchemaTable方法读取了表名信息,但是遗憾的是,改方法返回的数据中,WorkSheet的排列已经乱了(在返回的信息中,第二条数据未必就是2这个WorkSheet了).  还有什么方法可以解决这个问题吗?

解决方案 »

  1.   

    在WEB中显示EXCEL吗
    为什么要用数据库呢,你用数据库连接后SHEET的顺序肯定就乱了
    我用过WEBBROWSER控件来显示EXCEL的内容,非常方便
    如果不行,楼主也可以参考以下代码,或者循环取objSheet的值1,首先添加excel引用,不添加excel引用不行!
    2,代码:
                            // Start a new workbook in Excel.
    objExcel = new Excel.Application();
    objBooks = (Excel.Workbooks)objExcel.Workbooks;
    objBook = (Excel._Workbook)(objBooks.Add(objOpt)); //Add data to cells of the first worksheet in the new workbook.
    objSheets = (Excel.Sheets)objBook.Worksheets;
    //以下得到所有的表名
    string[] strTable = new string[objBook.Worksheets.Count];
    for(int i=0;i<objBook.Worksheets.Count;i++)
    {
    strTable[i] = ((Excel._Worksheet)(objSheets.get_Item(i))).Name;
    }
    //以下对第一张表进行操作
    objSheet = (Excel._Worksheet)(objSheets.get_Item(1));
    objRange = objSheet.get_Range("A1", objOpt);
    objRange.set_Value(objOpt,"Last Name");
    objRange = objSheet.get_Range("B1", objOpt);
    objRange.set_Value(objOpt,"First Name");
    objRange = objSheet.get_Range("A2", objOpt);
    objRange.set_Value(objOpt,"shao");
    objRange = objSheet.get_Range("B2", objOpt);
    objRange.set_Value(objOpt,"zhidong"); // Apply bold to cells A1:B1.
    objRange = objSheet.get_Range("A1", "B1");
    objFont = objRange.Font;
    objFont.Bold=true; // 以下修改第二张表
    objSheet = (Excel._Worksheet)(objSheets.get_Item(2));
    objRange = objSheet.get_Range("A1", objOpt);
    objRange.set_Value(objOpt,"姓名");
    objRange = objSheet.get_Range("B1", objOpt);
    objRange.set_Value(objOpt,"地址");
    objRange = objSheet.get_Range("A2", objOpt);
    objRange.set_Value(objOpt,"校长");
    objRange = objSheet.get_Range("B2", objOpt);
    objRange.set_Value(objOpt,"中国北京海淀");
    //合并单元格
    //假定要合并excel文件中第2行的1~3列,并且显示黑色边框
    Excel.Range rangesummary = objSheet.get_Range(objSheet.Cells[2,1],objSheet.Cells[2,3]);
    rangesummary.Value2 = Type.Missing; //必须的!由于excel本身的设计中考虑了与用户的交互,当此range中有值时,会弹出对话框。所以为了防止这种事情发生,应当清空值
    rangesummary.Merge(Type.Missing);
    rangesummary.Value2 = "小计:";
    rangesummary.Borders.Color = 0;
    rangesummary.Borders.Weight=2; // Save the workbook and quit Excel.
    objBook.SaveAs(strSampleFolder + "Book1.xls", objOpt, objOpt,
    objOpt, objOpt, objOpt, Excel.XlSaveAsAccessMode.xlNoChange,
    objOpt, objOpt, objOpt, objOpt, objOpt);
    objBook.Close(false, objOpt, objOpt);
    objExcel.Quit();
    //以下释放excel进程
    System.Runtime.InteropServices.Marshal.ReleaseComObject(objBook); 
    System.Runtime.InteropServices.Marshal.ReleaseComObject(objBooks); 
    System.Runtime.InteropServices.Marshal.ReleaseComObject(objSheets); 
    System.Runtime.InteropServices.Marshal.ReleaseComObject(objSheet); 
    System.Runtime.InteropServices.Marshal.ReleaseComObject(objExcel); 
    System.Runtime.InteropServices.Marshal.ReleaseComObject(objRange); 
    objBook = null;
    objBooks = null;
    objSheets=null; 
    objSheet=null; 
    objExcel=null; 
    objRange=null;  //把操作Excel文件用到的对象实例全部释放。 
     //然后资源回收! 
                GC.Collect();
      

  2.   

    谢谢楼上的朋友 ,该Excel我已经读入数据库了,现在只是需要类似Tab方式来显示Excel 中的WorkSheet,但其他数据均来自我自己的数据库(既Excel中的数据需要经过处理).  其实我要做的就是提供一个WorkSheet的导航条,分别显示Excel中的各个WorkSheet.点击不同的WorkSheet,相应显示已经过处理的数据。
      

  3.   

    Table和Tables_Info没有任何表的顺序的信息.因此靠这个办法应该是得不到顺序的.除非像楼上的用excel应用程序.其实这个顺序我觉得没有那么重要.
      

  4.   

    看看是不是这个
    Myexcel.Worksheets(1).name
    Myexcel.Worksheets(2).name
    Myexcel.Worksheets(3).name
    我就是这样得到三个表的名字的
      

  5.   

    除了Excel.ddl 其他没办法了吗? 用Excel的Com, 进程关不掉是个很恶心的问题.单例模式也好,不爽.