0

我正在通过 OleDbConnection 连接到 Excel 电子表格。

如何按 ColumnNumber 排序?我想做类似的事情: SELECT * FROM [Sheet1$] ORDERBY ColumnNumber 其中 ColumnNumber 是像 1 或 2 这样的数字?有任何想法吗 ?注意:我试图打开的文件没有标题。

 private String BuildConnectionStringXLS()
        {
            String fileName = GetFileName();

            Dictionary<string, string> props = new Dictionary<string, string>();
            props["Provider"] = "Microsoft.Jet.OLEDB.4.0";
            props["Data Source"] = fileName;
            props["Extended Properties"] = "\"Excel 8.0;HDR=No;IMEX=1\"";
            StringBuilder sb = new StringBuilder();
            foreach (KeyValuePair<string, string> prop in props) 
            {
                sb.Append(prop.Key); 
                sb.Append('=');
                sb.Append(prop.Value); 
                sb.Append(';'); 
            }
            return sb.ToString();
        }




    public DataTable GetFullTable(int columnToOrderBy)
        {
            String fileName = GetFileName();

            DataTable resultDataTable = new DataTable();
            String connectionString = BuildConnectionString();
            OleDbConnection conn = new OleDbConnection(connectionString);
            conn.Open();
            OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM [Sheet1$] ORDERBY ColumnNumber", conn);
            da.Fill(resultDataTable);
            conn.Close();
            return resultDataTable;
        }
4

1 回答 1

0
我发现您直接调用 [sheet1$] 而不引用任何链接服务器感到惊讶。以下是两种可能的方法:

    使用链接服务器

  • 首先创建一个链接服务器来访问excel数据,如下所示:
  • (我假设您已经拥有用于 excel 的 JET 或 ACE 提供程序)

      exec sp_addLinkedServer @server='ExcelLnkdServr', 
                        @srvproduct='ACE 12.0', 
                        @provider='Microsoft.ACE.OLEDB.12.0', 
                        @datasrc='\\sysdev\loadExcel.xlsx',
                        @provstr='Excel 12.0;HDR=Yes';
    /*  If the above creation is successful, you can see a listing when use SP_LINKEDSERVERS in SSMS. Now you can query the sheet using order by as below: */
       select * from ExcelLnkdServr...[Sheet1$]                    
      order by 1 asc, 2 desc 

      使用即席查询

  • 您可以 OPENROWSET、OPENDATASOURCE 或 OPENQUERY 如下所示:(第二个选项不需要任何链接服务器创建)
  •  select * from openquery(ExcelLnkdServr, 'SELECT * FROM [Sheet1$] order by 1 asc, 3 desc') 
    SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
        'Excel 12.0;Database=\\sysdev\loadExcel.xlsx;HDR=Yes','Select * from [Sheet1$] order by 1 asc') 
    于 2011-07-04T18:31:44.273 回答