首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL Server 透過 CLR/OLE 自動化取得 Excel 所有工作表名稱

     編輯:MySQL 資料庫相關知識

方案:使用 sp_OA* 系列預存程序操作 Excel COM 物件

需啟用 Ole Automation Procedures 進階選項:

EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE;

使用者定義函數 (UDF) 程式碼

USE tempdb;
GO
IF OBJECT_ID('dbo.udf_getExcelTableNames') IS NOT NULL DROP FUNCTION dbo.udf_getExcelTableNames;
GO
CREATE FUNCTION dbo.udf_getExcelTableNames(@filename VARCHAR(1000))
RETURNS @t TABLE (id INT, name VARCHAR(255))
AS
BEGIN
    DECLARE @error INT, @obj INT, @count INT, @sheetName VARCHAR(255), @sheetProp VARCHAR(255);

    EXEC @error = sp_OACreate 'Excel.Application', @obj OUT;
    EXEC @error = sp_OAMethod @obj, 'Workbooks.Open', @count OUT, @filename;
    EXEC @error = sp_OAGetProperty @obj, 'ActiveWorkbook.Sheets.Count', @count OUT;

    WHILE (@count > 0)
    BEGIN
        SET @sheetProp = 'ActiveWorkbook.Sheets(' + LTRIM(@count) + ').Name';
        EXEC @error = sp_OAGetProperty @obj, @sheetProp, @sheetName OUT;
        INSERT INTO @t SELECT @count, @sheetName;
        SET @count = @count - 1;
    END

    EXEC @error = sp_OADestroy @obj;
    RETURN;
END;
GO

-- 測試
SELECT * FROM dbo.udf_getExcelTableNames('E:/aa.xls');
/* 結果範例
id  name
3   Sheet3
2   Sheet2
1   Sheet1
*/

重要限制與替代方案

  • 需在資料庫伺服器機器上安裝 Excel,且為 32 位元相容模式
  • 服務帳戶需有桌面互動權限,安全性風險高
  • 生產環境建議改用:
    • SSIS 匯入/匯出精靈
    • OPENROWSET('Microsoft.ACE.OLEDB.12.0', ...) 搭配 ACE 驅動程式
    • 應用層 (C#/Python) 解析後再寫入資料庫
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved