Всем привет, на ходу учу C# (опыта практически нет), пишу приложение для обработки прайсов в Excel, застрял на процессе открытия файла, есть стринговая переменная с путем к файлу, а как открыть сам файл и забрать из него данные в массив не понимаю. В Delphi использовал OLE для этого, а тут как? Если можно, то опишите пожалуйста с примером. Поиск нужных результатов не дал.
Здравствуйте, Gerasym, Вы писали:
G>Всем привет, на ходу учу C# (опыта практически нет), пишу приложение для обработки прайсов в Excel, застрял на процессе открытия файла, есть стринговая переменная с путем к файлу, а как открыть сам файл и забрать из него данные в массив не понимаю. В Delphi использовал OLE для этого, а тут как? Если можно, то опишите пожалуйста с примером. Поиск нужных результатов не дал.
На C# управлять OLE-Automation сервером — геммор. Учи VB.NET
Здравствуйте, altarvic, Вы писали:
A>Здравствуйте, Gerasym, Вы писали:
G>>Всем привет, на ходу учу C# (опыта практически нет), пишу приложение для обработки прайсов в Excel, застрял на процессе открытия файла, есть стринговая переменная с путем к файлу, а как открыть сам файл и забрать из него данные в массив не понимаю. В Delphi использовал OLE для этого, а тут как? Если можно, то опишите пожалуйста с примером. Поиск нужных результатов не дал.
A>На C# управлять OLE-Automation сервером — геммор. Учи VB.NET
Здравствуйте, altarvic, Вы писали:
A>Здравствуйте, Gerasym, Вы писали:
G>>Всем привет, на ходу учу C# (опыта практически нет), пишу приложение для обработки прайсов в Excel, застрял на процессе открытия файла, есть стринговая переменная с путем к файлу, а как открыть сам файл и забрать из него данные в массив не понимаю. В Delphi использовал OLE для этого, а тут как? Если можно, то опишите пожалуйста с примером. Поиск нужных результатов не дал.
A>На C# управлять OLE-Automation сервером — геммор. Учи VB.NET
Стоит задача — забрать данные из файла в массив, обработать, и вернуть их в уже измененном виде.
Здравствуйте, lonli, Вы писали:
L>Здравствуйте, Gerasym, Вы писали:
L>Копай в сторону PIA ( здесь)
Не знаешь, как в этих интероп-сборках реализованы методы с кучей параметров? Через перегрузку или так и оставлены все параметры?
Вся заморочка при работе с C# как раз в этом — C# не может иметь параметров по умолчанию и не поддерживает т.н. named параметры. В этом плане те же Delphi и VB намного удобнее. Также приходится статически привязываться к этим сборкам, потому что динамически через Reflection — это вообще капец.
Здравствуйте, Gerasym, Вы писали:
G>Здравствуйте, altarvic, Вы писали:
A>>Здравствуйте, Gerasym, Вы писали:
G>>>Всем привет, на ходу учу C# (опыта практически нет), пишу приложение для обработки прайсов в Excel, застрял на процессе открытия файла, есть стринговая переменная с путем к файлу, а как открыть сам файл и забрать из него данные в массив не понимаю. В Delphi использовал OLE для этого, а тут как? Если можно, то опишите пожалуйста с примером. Поиск нужных результатов не дал.
A>>На C# управлять OLE-Automation сервером — геммор. Учи VB.NET
G>Стоит задача — забрать данные из файла в массив, обработать, и вернуть их в уже измененном виде.
Здравствуйте, altarvic, Вы писали:
A>Не знаешь, как в этих интероп-сборках реализованы методы с кучей параметров? Через перегрузку или так и оставлены все параметры?
Неа. Просто по работе недавно понадобилось узнавать про эти сборки, вспомнилось. Подробностей использования не знаю
Здравствуйте, 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;
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[2]: Вопросы по работе с Excel
От:
Аноним
Дата:
27.04.07 10:42
Оценка:
Здравствуйте, Pavel_Agurov, Вы писали:
P_A>Кажется я уже приводил этот код отсюда.
В случае использования второго метода необходимо будет освобождать все объекты связанные с работой Excel.
Иначе Excel не будет выгружаться после завершения работы функции/ программы.
Здравствуйте, 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.
Здравствуйте, 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>выложил тут
Здравствуйте, Gerasym, Вы писали:
G>Всем привет, на ходу учу C# (опыта практически нет), пишу приложение для обработки прайсов в Excel, застрял на процессе открытия файла, есть стринговая переменная с путем к файлу, а как открыть сам файл и забрать из него данные в массив не понимаю. В Delphi использовал OLE для этого, а тут как? Если можно, то опишите пожалуйста с примером. Поиск нужных результатов не дал.
При попытке выполнения: System.Runtime.InteropServices.COMException was unhandled
Message="Использован старый формат, либо библиотека имеет неверный тип. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))"
Здравствуйте, Gerasym, Вы писали:
G>Здравствуйте, Gerasym, Вы писали:
G>>Всем привет, на ходу учу C# (опыта практически нет), пишу приложение для обработки прайсов в Excel, застрял на процессе открытия файла, есть стринговая переменная с путем к файлу, а как открыть сам файл и забрать из него данные в массив не понимаю. В Delphi использовал OLE для этого, а тут как? Если можно, то опишите пожалуйста с примером. Поиск нужных результатов не дал.
G>Столкнулся с проблемой:
G>При попытке выполнения: System.Runtime.InteropServices.COMException was unhandled G> Message="Использован старый формат, либо библиотека имеет неверный тип. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))"
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).
Здравствуйте, 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).