Использование драйвера OLEDB / Microsoft Jet приводит к тому, что «Число сохраняется в виде текста» в файле Excel - PullRequest
4 голосов
/ 26 мая 2009

У меня проблема с использованием OLDEDB из C # для записи записей в файл Excel. По сути, я хочу использовать файл шаблона Excel для форматирования некоторой информации. Идея состоит в том, что пользователи могут выполнить запрос, он заполняет результаты в файл Excel, где пользователь может затем продолжать использовать Excel для манипулирования результатами.

Для этого я создаю вкладку «raw_data» и использую OLEDB для записи в нее, как в таблице. Однако я сталкиваюсь с проблемой, где предустановленные расчеты. Некоторые столбцы являются текстовыми, другие являются числами, и формальные должны ссылаться на эти столбцы, как только лист открывается.

Excel Версия 2003 C # /. Net 3.5

Вот моя строка подключения

string connectString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={filename};Extended Properties=""Excel 8.0;HDR=YES;IMEX=0""";

{имя_файла} get будет заменено позже в коде с путем к файлу

DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.OleDb");
using (DbConnection connection = factory.CreateConnection())
{
  connection.ConnectionString = connectString;
  using (DbCommand command = connection.CreateCommand())
  {

    connection.Open();
    query = "INSERT INTO [raw_prod$] (correlationid, created, ipaddr, nai, started, delta, csid, bytesin, bytesout, cause, bsid, servopt, svzone) VALUES (\"{correlationid}\", \"{created}\", \"{ipaddr}\", \"{nai}\", \"{started}\", {delta}, \"{csid}\", {bytesin}, {bytesout}, {cause}, \"{bsid}\", \"{servopt}\", \"{zone}\")";
    //Replace {} code with actual values skipped
    command.CommandText = query;
    command.ExecuteNonQuery();
  }
}

Когда этот прогон получает данные, как и ожидалось, но Excel обрабатывает данные как текст, поэтому такие вещи, как сумма (c2: c100) не работают. Если я просто выделю запись и нажму ввод, она автоматически станет текстом. Я попытался отформатировать столбец в число в шаблоне, и, как вы можете видеть, я удалил двойные кавычки в SQL.

Как получить Excel, чтобы сразу обрабатывать эти записи как числовые, чтобы все вычисления работали?

Спасибо

Ответы [ 4 ]

2 голосов
/ 26 мая 2009

Я понял, это было на самом деле глупо раздражает. В моем файле Excel для строк 2 - 8 для любого столбца я хотел быть числом, которое я только что заполнил фиктивными числами. Таким образом, драйвер Jet при сканировании этих столбцов будет видеть числа и учитывать номера этих столбцов. Затем мои вставки из C # запускаются в строке 9, и я соответственно отредактировал шаблон, чтобы начать вычисления только со строки 9 и далее. Действительно боль, но, кажется, работает.

2 голосов
/ 26 мая 2009

Вы пытались изменить настройку reg для TypeGuessRows? HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ Excel \ TypeGuessRows должны быть где искать Jet 4.0 В целях отладки вы можете установить для него значение, большее, чем значение по умолчанию, равное 8, (или, если абсолютно точно первая строка верна, установить его на 1).

Некоторые ссылки для помощи в отладке Ежедневно ли и MSDN

Aha! Просто заметил пример внизу вашего кода. Попробуйте удалить кавычки вокруг тех значений, которые являются числовыми

\"{correlationid}\", \"{created}\", \"{ipa

Я думаю, будет

{correlationid}, \"{created}\", \"{ipa
0 голосов
/ 18 июля 2011

У меня была та же проблема с Excel 2007, и я решил ее двумя способами:

  • Используя метод CREATE TABLE, упомянутый выше в статье philw
  • Изменение строки подключения и добавление «xml» после Excel 12.0 part

См. Следующий пример кода

string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=""" + scratchFile 
    + @""";Extended Properties=""Excel 12.0 xml;HDR=YES""";   

DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.OleDb");

using (DbConnection connection = factory.CreateConnection())
{
    connection.ConnectionString = connectionString;

    using (DbCommand command = connection.CreateCommand())
    {
        connection.Open();

        command.CommandText = @"CREATE TABLE [RawData$] " + 
            "([Organization] varchar(255), " +
            "[Department] varchar(255), [TotalSales] int, [TotalHours] int)";
        command.ExecuteNonQuery();

        command.CommandText = @"INSERT INTO [RawData$] " +
            "(Organization,Department,TotalSales,TotalHours)" +
            "VALUES('Organization','Department',700,70)";

        command.ExecuteNonQuery();

    }
}
0 голосов
/ 20 августа 2010

Вы делаете это, явно сообщая Jet, какой тип столбцов при создании таблицы для экспорта:

 "create table [tabName] ([col1] varchar(255), [col2] double)"

Единственный улов в том, что если вы попытаетесь вставить символьные данные в числовой столбец, Jet вставит при вставке, что неудивительно.

С этим связана проблема, связанная с тем, как вы обрабатываете пустые значения: пустая строка не является нулевой в том, что касается Jet: если вы попытаетесь вставить ее в числовой столбец, Jet выбросит.

...