我有一张自己编制的EXCEL表格(非标准的.就是经过很多合并单元格之类的操作的)
我自己把这个EXCEL文件的内容读到数据库了
我用
Provider=Microsoft.Jet.OLEDB.4.0;...Extended Properties=Excel 8.0;
连接我的EXCEL文件 可是有很多单元格的内容都读不出来
请问各位有什么好办法吗?
(我不想用EXCEL 组件)再问一下各位 如果我用ASP程序读一个EXCEL文件.能不能不把这个文件上传到服务器里 直接在客户端读文件内容.

解决方案 »

  1.   

    非标准的excel用数据库驱动就不好读了,还是用组件方式来读把
      

  2.   

    确实有这样的问题, 用 OLEDB 读 Excel 表格很多字段消失了.本人的折衷解决办法:在 Excel 中将表格存为 Xml 格式, 然后再用 C# XmlDocument 或 XPathDocument 来读取.Excel 存储的 Xml 格式比较简单, 你一看就会明白, 读取的算法也很 easy. 但读取的时候要注意命名空间.
      

  3.   

    要是服务器上没装组件怎么办?
    我现在是用 http://vwdhosting.net/ 上提供的免费空间 在调试读 EXCEL 时提示
    Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80040154我应该怎么解决呢?
      

  4.   

    celas(长刀公主):那能不能编程实现 EXCEL 文件转成 XML呢?有没有具体的例子能发个给我吗?谢谢了.
      

  5.   

    如果编程实现 Excel -> XML, 那肯定要先读出完整数据来才能进行转换, 这是前提, 这不又回到了你开始的问题了 ?OLE DB 会丢失数据, 而你又不想用组件, 估计没办法了.
      

  6.   

    excel的另存为,就有保存为XML数据的功能。
      

  7.   

    本人以前写的 Excel 所导出 XML 文件转换为 DataTable 的样例代码.
    你看看意思可以, 要用的话不能直接 Copy, 这段代码对我所用的表格有特殊的处理(自动分析表头). 你得修改一下.    public static void FillTable(string xmlFilePath, DataTable dt) {
          if (string.IsNullOrEmpty(xmlFilePath) || dt == null) {
            return;
          }      XPathDocument doc = new XPathDocument(xmlFilePath);
          XPathNavigator nav = doc.CreateNavigator();
          string ns = "urn:schemas-microsoft-com:office:spreadsheet";
          string ss = "urn:schemas-microsoft-com:office:spreadsheet";
          XmlNamespaceManager mgr = new XmlNamespaceManager(nav.NameTable);
          mgr.AddNamespace("ns", ns);
          mgr.AddNamespace("ss", ss);      bool dataSectionStart = false;
          NameValueCollection cols = new NameValueCollection();      XPathNavigator vTbl = nav.SelectSingleNode("/ns:Workbook/ns:Worksheet/ns:Table", mgr);
          if (vTbl == null) {
            throw new TException(TException.Error, "Unable to locate 'Workbook/Worksheet/Table' element in source file.");
          }      XPathNodeIterator iRows = vTbl.SelectChildren("Row", ns);
          if (iRows == null) { return; }      while (iRows.MoveNext()) {
            NameValueCollection row = new NameValueCollection();
            XPathNodeIterator iCells = iRows.Current.SelectChildren("Cell", ns);
            if (iCells == null) { continue; }        for (int index = 1; iCells.MoveNext(); index++){
              XPathNavigator vCell = iCells.Current;
              XPathNavigator vData = vCell.SelectSingleNode("ns:Data", mgr);
              if (vData == null) { continue; }
              int idx = TUtil.ToInt(vCell.GetAttribute("Index", ss));
              if (idx > 0) { index = idx; }
              if (!dataSectionStart) {
                if (Regex.IsMatch(vData.Value, @"\A[a-z]+\Z", RegexOptions.IgnoreCase)) {
                  cols[index.ToString()] = vData.Value;
                  continue;
                } else {
                  cols.Clear();
                  break;
                }
              } else {
                row[index.ToString()] = vData.Value;
              }
            }        if (dataSectionStart && row.Count > 0) {
              DataRow dr = dt.NewRow();
              dr[cstv["KEY_ROW_ID"]] = dt.Rows.Count.ToString();
              foreach (string key in cols) {
                string colName = cols[key];
                dr[colName] = row[key];
              }
              dt.Rows.Add(dr);
            } else if (cols.Count > 0 && dt.Columns.Count <= 0) {
              dataSectionStart = true;
              DataColumn dc = new DataColumn();
              dc.ColumnName = cstv["KEY_ROW_ID"];
              dc.DataType = typeof(string);
              dt.Columns.Add(dc);
              foreach (string key in cols) {
                dc = new DataColumn();
                dc.ColumnName = cols[key].ToString();
                dc.DefaultValue = "";
                dc.DataType = typeof(string);
                dt.Columns.Add(dc);
              }
            } else {
              continue;
            }
          }
        }