Re: Вопросы по работе с Excel
От: Pavel_Agurov Россия  
Дата: 27.04.07 10:31
Оценка: 6 (1)
Кажется я уже приводил этот код отсюда.

Вариант 1.

using System;
using System.Data;
using System.Data.OleDb;

namespace ExcelDataTestApplication
{
  class Class1
  {
    [STAThread]
    static void Main(string[] args)
    {
      // Имя файла
      string filename = @"book1.xls";

      // Строка подключения
      string ConnectionString= String.Format(
        "Provider=Microsoft.Jet.OLEDB.4.0;Extended
                    Properties=\"Excel 8.0;HDR=No\";
                    Data Source={0}", filename);
      // Открываем соединение
      DataSet   ds=new DataSet("EXCEL");
      OleDbConnection cn=new OleDbConnection(ConnectionString);
      cn.Open();

      // Получаем списко листов в файле
      DataTable schemaTable =
        cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, 
            new object[] {null, null, null, "TABLE"});

      // Показать список листов в файле
      for (int i=0; i< schemaTable.Rows.Count; i++)
      {
        // Имена листов
        Console.WriteLine(schemaTable.Rows[i].ItemArray[2]);
        
        // Дата модификации
        Console.WriteLine(schemaTable.Rows[i].ItemArray[7]);
      }

      // Берем название первого листа
      string sheet1 = (string) schemaTable.Rows[0].ItemArray[2];
      // Выбираем все данные с листа
      string select = String.Format("SELECT * FROM [{0}]", sheet1);
      OleDbDataAdapter ad = new OleDbDataAdapter(select, cn);
      ad.Fill(ds);
      DataTable tb=ds.Tables[0];

      // Показать данные с листа
      foreach (DataRow row in tb.Rows)
      {
        foreach(object col in row.ItemArray)
        {
          Console.Write(col+"\t");
        }
        Console.WriteLine();
      }
    }
  }
}


Вариант 2.

using Excel;
using System;
using System.IO;
using System.Reflection;

namespace ExcelReader
{
  class Class1
  {
    [STAThread]
    static void Main(string[] args)
    {
      ApplicationClass application = null;
      string   filename;
      Workbook   workbook;
      Worksheet  worksheet;
      object   objsheet, objrange;
      Range   range;
 
      // Должно быть полное имя
      filename = Path.Combine(
            System.AppDomain.CurrentDomain.BaseDirectory ,
            @"test.xls");

      try
      {
        application = new ApplicationClass();
        application.Visible=false;
        application.DisplayAlerts=false;

        workbook = application.Workbooks.Open(
          filename, 
          Missing.Value, 
          Missing.Value, 
          Missing.Value, 
          Missing.Value, 
          Missing.Value, 
          Missing.Value, 
          Missing.Value, 
          Missing.Value, 
          Missing.Value, 
          Missing.Value, 
          Missing.Value, 
          Missing.Value
          );

        objsheet = workbook.ActiveSheet;
        if (objsheet != null)
        {
          worksheet = (Worksheet) objsheet;
          objrange = worksheet.Cells[1, 1];
          if (objrange != null)
          {
            range = (Range) objrange;
            range.Font.Name="Tahoma";
            range.Font.Size=8;
            range.Font.Bold=false;
            range.Value = "новое значение";
            range = null;
          }
          objrange = null;
          worksheet = null;
        }
        objsheet = null;

        workbook.Save();
        workbook = null;
      }
      catch(Exception ex)
      {
        Console.WriteLine(ex.ToString());
      }
      finally
      {
        if (application != null)
        {
          application.Quit();
        }
        application = null;
      }
    }
  }
}
Re[3]: Вопросы по работе с Excel
От: Andrbig  
Дата: 02.05.07 10:26
Оценка: 3 (1)
G>>При попытке выполнения: System.Runtime.InteropServices.COMException was unhandled
G>> Message="Использован старый формат, либо библиотека имеет неверный тип. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))"

G>Помогите пожалуйста, проблема остается


1. There is a bug in Excel 2003 that may cause an "Old format or invalid type library" exception. The exception is thrown when the method your calling or the method called internally by the public property requires an LCID locale identifier and you're running an English version of Excel on a computer with a forreign regional setting.
The easiest way to workaround the bug is to set the CurrentCulture property of the Thread to en-US.
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");


2. Позднее связывание (особенно если надо работать с различными версиями Excel).
Re[2]: Вопросы по работе с Excel
От: Andrbig  
Дата: 04.05.07 05:06
Оценка: :)
Здравствуйте, Gerasym, Вы писали:

G>Подскажите пожалуйста кто знает:


G>Есть:


G>range = worksheet.get_Range("A1",worksheet.Cells[worksheet.UsedRange.Rows.Count,worksheet.UsedRange.Columns.Count]);


G>Я так понимаю это диапазон ячеек?


G>Как этот range запихнуть в текстовый массив?


.Value

Только если диапазон несколько ячеек, будет массив, если одна ячейка, будет просто значение. Это долбаный интеллект excel. Я тебя поздравляю, ты ступил на путь борьбы с ним. Все только начинается...
Вопросы по работе с Excel
От: Gerasym Украина  
Дата: 27.04.07 09:40
Оценка:
Всем привет, на ходу учу C# (опыта практически нет), пишу приложение для обработки прайсов в Excel, застрял на процессе открытия файла, есть стринговая переменная с путем к файлу, а как открыть сам файл и забрать из него данные в массив не понимаю. В Delphi использовал OLE для этого, а тут как? Если можно, то опишите пожалуйста с примером. Поиск нужных результатов не дал.
Re: Вопросы по работе с Excel
От: altarvic  
Дата: 27.04.07 09:45
Оценка:
Здравствуйте, Gerasym, Вы писали:

G>Всем привет, на ходу учу C# (опыта практически нет), пишу приложение для обработки прайсов в Excel, застрял на процессе открытия файла, есть стринговая переменная с путем к файлу, а как открыть сам файл и забрать из него данные в массив не понимаю. В Delphi использовал OLE для этого, а тут как? Если можно, то опишите пожалуйста с примером. Поиск нужных результатов не дал.


На C# управлять OLE-Automation сервером — геммор. Учи VB.NET
Re[2]: Вопросы по работе с Excel
От: Gerasym Украина  
Дата: 27.04.07 09:47
Оценка:
Здравствуйте, altarvic, Вы писали:

A>Здравствуйте, Gerasym, Вы писали:


G>>Всем привет, на ходу учу C# (опыта практически нет), пишу приложение для обработки прайсов в Excel, застрял на процессе открытия файла, есть стринговая переменная с путем к файлу, а как открыть сам файл и забрать из него данные в массив не понимаю. В Delphi использовал OLE для этого, а тут как? Если можно, то опишите пожалуйста с примером. Поиск нужных результатов не дал.


A>На C# управлять OLE-Automation сервером — геммор. Учи VB.NET


А все-таки?
Re: Вопросы по работе с Excel
От: lonli Беларусь  
Дата: 27.04.07 09:47
Оценка:
Здравствуйте, Gerasym, Вы писали:

Копай в сторону PIA ( здесь)
Проклятый девятнадцатый век, проклятое воспитание: не могу стоять, когда мужчины сидят. ©Ф.Раневская
Re[2]: Вопросы по работе с Excel
От: Gerasym Украина  
Дата: 27.04.07 09:48
Оценка:
Здравствуйте, altarvic, Вы писали:

A>Здравствуйте, Gerasym, Вы писали:


G>>Всем привет, на ходу учу C# (опыта практически нет), пишу приложение для обработки прайсов в Excel, застрял на процессе открытия файла, есть стринговая переменная с путем к файлу, а как открыть сам файл и забрать из него данные в массив не понимаю. В Delphi использовал OLE для этого, а тут как? Если можно, то опишите пожалуйста с примером. Поиск нужных результатов не дал.


A>На C# управлять OLE-Automation сервером — геммор. Учи VB.NET


Стоит задача — забрать данные из файла в массив, обработать, и вернуть их в уже измененном виде.
Re[2]: Вопросы по работе с Excel
От: altarvic  
Дата: 27.04.07 09:59
Оценка:
Здравствуйте, lonli, Вы писали:

L>Здравствуйте, Gerasym, Вы писали:


L>Копай в сторону PIA ( здесь)


Не знаешь, как в этих интероп-сборках реализованы методы с кучей параметров? Через перегрузку или так и оставлены все параметры?
Вся заморочка при работе с C# как раз в этом — C# не может иметь параметров по умолчанию и не поддерживает т.н. named параметры. В этом плане те же Delphi и VB намного удобнее. Также приходится статически привязываться к этим сборкам, потому что динамически через Reflection — это вообще капец.
Re[3]: Вопросы по работе с Excel
От: altarvic  
Дата: 27.04.07 10:02
Оценка:
Здравствуйте, Gerasym, Вы писали:

G>Здравствуйте, altarvic, Вы писали:


A>>Здравствуйте, Gerasym, Вы писали:


G>>>Всем привет, на ходу учу C# (опыта практически нет), пишу приложение для обработки прайсов в Excel, застрял на процессе открытия файла, есть стринговая переменная с путем к файлу, а как открыть сам файл и забрать из него данные в массив не понимаю. В Delphi использовал OLE для этого, а тут как? Если можно, то опишите пожалуйста с примером. Поиск нужных результатов не дал.


A>>На C# управлять OLE-Automation сервером — геммор. Учи VB.NET


G>Стоит задача — забрать данные из файла в массив, обработать, и вернуть их в уже измененном виде.


посмотри здесь
Автор(ы): Гасанов Ровшан Закариевич
Дата: 17.11.2005
Статья рассказывает о динамическом взаимодействии с Excel посредством OLE Automation и рефлексии.
Требуется знание С#.
Re[3]: Вопросы по работе с Excel
От: lonli Беларусь  
Дата: 27.04.07 10:07
Оценка:
Здравствуйте, altarvic, Вы писали:

A>Не знаешь, как в этих интероп-сборках реализованы методы с кучей параметров? Через перегрузку или так и оставлены все параметры?


Неа. Просто по работе недавно понадобилось узнавать про эти сборки, вспомнилось. Подробностей использования не знаю
Страшно грустна моя жизнь. А вы хотите,чтобы я воткнула в жопу куст сирени и делала перед вами стриптиз. ©Ф.Раневская
Re: Вопросы по работе с Excel
От: Black_delfin  
Дата: 27.04.07 10:23
Оценка:
Здравствуйте, Gerasym, Вы писали:

G>Всем привет, на ходу учу C# (опыта практически нет), пишу приложение для обработки прайсов в Excel, застрял на процессе открытия файла, есть стринговая переменная с путем к файлу, а как открыть сам файл и забрать из него данные в массив не понимаю. В Delphi использовал OLE для этого, а тут как? Если можно, то опишите пожалуйста с примером. Поиск нужных результатов не дал.

 #region OPEN_WORD
            try
            {
                a = Marshal.GetActiveObject("Word.Application") as Word.Application;
            }
            catch
            {
                a = new Word.Application();
            }
            
            doc = a.Documents.Open(ref FileName, ref tp, ref tp, ref tp, ref tp, ref tp, ref tp, ref tp,
            ref tp, ref tp, ref tp, ref tp, ref tp, ref tp, ref tp, ref tp);
 #endregion

            Tables tbs = doc.Tables;
            str = valid1(tbs);
            CloseWord();
// сюда же 
using System.Runtime.InteropServices;
using System.Collections.Generic;
using Word;
// и 
Word.Application a;
Word.Document doc;
// и 
string fl = FDialog();

object FileName = fl;
object tp = Type.Missing;


Может поможет по аналогу)

delfin :)
Re[2]: Вопросы по работе с Excel
От: Аноним  
Дата: 27.04.07 10:42
Оценка:
Здравствуйте, Pavel_Agurov, Вы писали:

P_A>Кажется я уже приводил этот код отсюда.



В случае использования второго метода необходимо будет освобождать все объекты связанные с работой Excel.
Иначе Excel не будет выгружаться после завершения работы функции/ программы.
Re[2]: Вопросы по работе с Excel
От: Gerasym Украина  
Дата: 27.04.07 11:47
Оценка:
xl.Application.Workbooks.Open(ListFile.Items[i].ToString,
Missing.Value,
Missing.Value,
Missing.Value,
Missing.Value,
Missing.Value,
Missing.Value,
Missing.Value,
Missing.Value,
Missing.Value,
Missing.Value,
Missing.Value,
Missing.Value);

Ругается Error 1 No overload for method 'Open' takes '13' arguments C:\MSVSP\Temp\WindowsApplication1\WindowsApplication1\Form1.cs 52 21 WindowsApplication1
Re[3]: Вопросы по работе с Excel
От: Pavel_Agurov Россия  
Дата: 27.04.07 12:01
Оценка:
G>Ругается Error 1 No overload for method 'Open' takes '13' arguments C:\MSVSP\Temp\WindowsApplication1\WindowsApplication1\Form1.cs 52 21 WindowsApplication1

Пример приложения. Все работает. Не уверен, может версия офиса как-то влияет?

выложил тут
Re[4]: Вопросы по работе с Excel
От: Gerasym Украина  
Дата: 27.04.07 12:14
Оценка:
Здравствуйте, Pavel_Agurov, Вы писали:

G>>Ругается Error 1 No overload for method 'Open' takes '13' arguments C:\MSVSP\Temp\WindowsApplication1\WindowsApplication1\Form1.cs 52 21 WindowsApplication1


P_A>Пример приложения. Все работает. Не уверен, может версия офиса как-то влияет?


P_A>выложил тут


Похоже, что влияет, у меня и на твое приложение так же ругается, Office 2003 Eng, SP2.
Re[4]: Вопросы по работе с Excel
От: Gerasym Украина  
Дата: 27.04.07 12:18
Оценка:
Здравствуйте, Pavel_Agurov, Вы писали:

G>>Ругается Error 1 No overload for method 'Open' takes '13' arguments C:\MSVSP\Temp\WindowsApplication1\WindowsApplication1\Form1.cs 52 21 WindowsApplication1


P_A>Пример приложения. Все работает. Не уверен, может версия офиса как-то влияет?


P_A>выложил тут


http://files.rsdn.ru/65600/Temp.rar вот мое, есть желающие проверить работоспособность?
Re: Вопросы по работе с Excel
От: Gerasym Украина  
Дата: 27.04.07 14:21
Оценка:
Здравствуйте, Gerasym, Вы писали:

G>Всем привет, на ходу учу C# (опыта практически нет), пишу приложение для обработки прайсов в Excel, застрял на процессе открытия файла, есть стринговая переменная с путем к файлу, а как открыть сам файл и забрать из него данные в массив не понимаю. В Delphi использовал OLE для этого, а тут как? Если можно, то опишите пожалуйста с примером. Поиск нужных результатов не дал.


Столкнулся с проблемой:


ApplicationClass xl= new Microsoft.Office.Interop.Excel.ApplicationClass();
Microsoft.Office.Interop.Excel.Workbook wb;
wb = xl.Workbooks.Open(
                    filename,
                    Missing.Value,
                    Missing.Value,
                    Missing.Value,
                    Missing.Value,
                    Missing.Value,
                    Missing.Value,
                    Missing.Value,
                    Missing.Value,
                    Missing.Value,
                    Missing.Value,
                    Missing.Value,
                    Missing.Value,
                    Missing.Value,
                    Missing.Value
                    );



При попытке выполнения: System.Runtime.InteropServices.COMException was unhandled
Message="Использован старый формат, либо библиотека имеет неверный тип. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))"
Re[2]: Вопросы по работе с Excel
От: Gerasym Украина  
Дата: 02.05.07 08:18
Оценка:
Здравствуйте, Gerasym, Вы писали:

G>Здравствуйте, Gerasym, Вы писали:


G>>Всем привет, на ходу учу C# (опыта практически нет), пишу приложение для обработки прайсов в Excel, застрял на процессе открытия файла, есть стринговая переменная с путем к файлу, а как открыть сам файл и забрать из него данные в массив не понимаю. В Delphi использовал OLE для этого, а тут как? Если можно, то опишите пожалуйста с примером. Поиск нужных результатов не дал.


G>Столкнулся с проблемой:



G>
G>ApplicationClass xl= new Microsoft.Office.Interop.Excel.ApplicationClass();
G>Microsoft.Office.Interop.Excel.Workbook wb;
G>wb = xl.Workbooks.Open(
G>                    filename,
G>                    Missing.Value,
G>                    Missing.Value,
G>                    Missing.Value,
G>                    Missing.Value,
G>                    Missing.Value,
G>                    Missing.Value,
G>                    Missing.Value,
G>                    Missing.Value,
G>                    Missing.Value,
G>                    Missing.Value,
G>                    Missing.Value,
G>                    Missing.Value,
G>                    Missing.Value,
G>                    Missing.Value
G>                    );
G>



G>При попытке выполнения: System.Runtime.InteropServices.COMException was unhandled

G> Message="Использован старый формат, либо библиотека имеет неверный тип. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))"

Помогите пожалуйста, проблема остается
Re[4]: Вопросы по работе с Excel
От: Gerasym Украина  
Дата: 02.05.07 11:45
Оценка:
Здравствуйте, Andrbig, Вы писали:

G>>>При попытке выполнения: System.Runtime.InteropServices.COMException was unhandled

G>>> Message="Использован старый формат, либо библиотека имеет неверный тип. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))"

G>>Помогите пожалуйста, проблема остается


A>1. There is a bug in Excel 2003 that may cause an "Old format or invalid type library" exception. The exception is thrown when the method your calling or the method called internally by the public property requires an LCID locale identifier and you're running an English version of Excel on a computer with a forreign regional setting.

A>The easiest way to workaround the bug is to set the CurrentCulture property of the Thread to en-US.
A>
A>System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); 
A>


A>2. Позднее связывание (особенно если надо работать с различными версиями Excel).


Спасибо за помощь, помогло
Re: Вопросы по работе с Excel
От: Gerasym Украина  
Дата: 03.05.07 13:52
Оценка:
Подскажите пожалуйста кто знает:

Есть:

range = worksheet.get_Range("A1",worksheet.Cells[worksheet.UsedRange.Rows.Count,worksheet.UsedRange.Columns.Count]);

Я так понимаю это диапазон ячеек?

Как этот range запихнуть в текстовый массив?
Re[3]: Вопросы по работе с Excel
От: Gerasym Украина  
Дата: 04.05.07 15:08
Оценка:
Здравствуйте, Andrbig, Вы писали:

A>Здравствуйте, Gerasym, Вы писали:


G>>Подскажите пожалуйста кто знает:


G>>Есть:


G>>range = worksheet.get_Range("A1",worksheet.Cells[worksheet.UsedRange.Rows.Count,worksheet.UsedRange.Columns.Count]);


G>>Я так понимаю это диапазон ячеек?


G>>Как этот range запихнуть в текстовый массив?


A>.Value


A>Только если диапазон несколько ячеек, будет массив, если одна ячейка, будет просто значение. Это долбаный интеллект excel. Я тебя поздравляю, ты ступил на путь борьбы с ним. Все только начинается...


Странно но редактор вообще не понимает .value (диапазон), понимает только .value2 (ячейка)
Re: Вопросы по работе с Excel
От: Igor Trofimov  
Дата: 04.05.07 16:53
Оценка:
Вообще часто вместо дурацкого Automation лучше использовать хитрые библиотечки (GemBox, Aspose), которые работают с файлом Excel'я напрямую.
Re: Вопросы по работе с Excel
От: blumenkraft  
Дата: 06.05.07 13:21
Оценка:
Здравствуйте, Gerasym, Вы писали:

G>Всем привет, на ходу учу C# (опыта практически нет), пишу приложение для обработки прайсов в Excel, застрял на процессе открытия файла, есть стринговая переменная с путем к файлу, а как открыть сам файл и забрать из него данные в массив не понимаю. В Delphi использовал OLE для этого, а тут как? Если можно, то опишите пожалуйста с примером. Поиск нужных результатов не дал.


На самом деле все примитивно. Скачиваете Primary Interop Assemblies с сайта Майкрософта. Добавляете ссылку в ваш проект. Ну а далее стандартная автоматизация — Excel.Application app = new Excel.Application() и всё такое.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Вопросы по работе с Excel
От: Andrbig  
Дата: 07.05.07 05:52
Оценка:
Здравствуйте, Gerasym, Вы писали:

G>Здравствуйте, Andrbig, Вы писали:


A>>Здравствуйте, Gerasym, Вы писали:


G>>>Подскажите пожалуйста кто знает:


G>>>Есть:


G>>>range = worksheet.get_Range("A1",worksheet.Cells[worksheet.UsedRange.Rows.Count,worksheet.UsedRange.Columns.Count]);


G>>>Я так понимаю это диапазон ячеек?


G>>>Как этот range запихнуть в текстовый массив?


A>>.Value


A>>Только если диапазон несколько ячеек, будет массив, если одна ячейка, будет просто значение. Это долбаный интеллект excel. Я тебя поздравляю, ты ступил на путь борьбы с ним. Все только начинается...


G>Странно но редактор вообще не понимает .value (диапазон), понимает только .value2 (ячейка)


Разница между ними невелика. Используй Value2.

The only difference between this property and the Value property is that the Value2 property doesn’t use the Currency and Date data types. You can return values formatted with these data types as floating-point numbers by using the Double data type.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.