Использование драйвера OLEDB / Microsoft Jet приводит к тому, что число сохраняется в виде текста в файле Excel

У меня проблема с использованием 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""";

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

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 обрабатывает данные как текст, поэтому такие вещи, как sum (c2: c100), не работают. Если я просто выделю запись и нажму Enter, она автоматически превратится в текст. Я попытался отформатировать столбец под номер в шаблоне и, как вы можете видеть, удалил двойные кавычки в sql.

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

Спасибо


person Kevin Nisbet    schedule 25.05.2009    source источник


Ответы (4)


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

Некоторые ссылки для помощи в отладке Daily Does и MSDN

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

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

Я предполагаю было бы

{correlationid}, \"{created}\", \"{ipa
person Simon Wilson    schedule 26.05.2009
comment
У меня уже есть в них без кавычек, просто за кадром: {bytesin}, - person Kevin Nisbet; 26.05.2009

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

person Kevin Nisbet    schedule 26.05.2009

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

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

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

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

person philw    schedule 20.08.2010

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

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

См. Следующий образец кода

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();

    }
}
person Jon YYC    schedule 18.07.2011