Вот пара идей:
Открыта ли целевая рабочая книга? Существует ошибка ( Утечка памяти возникает при запросе открытого листа Excel с использованием объектов данных ActiveX ), который на самом деле IIRC находится в поставщике OLE DB для Jet (который вы используете), хотя это не подтверждается в вышеуказанной статье.
Несмотря на это, кажется, что массовая вставка - это то, что нужно.
Для этого вы можете использовать того же поставщика Jet OLE DB: все, что вам нужно - это таблица из одной строки. Вы могли бы даже изготовить один на лету. Чтобы создать новую книгу Excel, выполните CREATE TABLE
DDL, используя несуществующий файл xls в строке подключения, и поставщик создаст для вас книгу с рабочим листом для представления таблицы. У вас есть подключение к вашей книге Excel, чтобы вы могли выполнить это:
CREATE TABLE [EXCEL 8.0;DATABASE=C:\MyFabricatedWorkbook;HDR=YES].OneRowTable
(
x FLOAT
);
(ИМО даже лучше было бы изготовить базу данных Jet, т.е. файл .mdb).
Используйте INSERT
для создания фиктивной строки:
INSERT INTO [EXCEL 8.0;DATABASE=C:\MyFabricatedWorkbook;HDR=YES].OneRowTable (x)
VALUES (0);
Затем, продолжая использовать ваше соединение с целевой книгой, вы можете использовать нечто похожее на следующее, чтобы создать производную таблицу (DT1) с вашими значениями, равными INSERT
за одно нажатие:
INSERT INTO MyExcelTable (key_col, data_col)
SELECT DT1.key_col, DT1.data_col
FROM (
SELECT 22 AS key_col, 'abc' AS data_col
FROM [EXCEL 8.0;DATABASE=C:\MyFabricatedWorkbook;HDR=YES].OneRowTable
UNION ALL
SELECT 55 AS key_col, 'xyz' AS data_col
FROM [EXCEL 8.0;DATABASE=C:\MyFabricatedWorkbook;HDR=YES].OneRowTable
UNION ALL
SELECT 99 AS key_col, 'efg' AS data_col
FROM [EXCEL 8.0;DATABASE=C:\MyFabricatedWorkbook;HDR=YES].OneRowTable
) AS DT1;