Сегодня я хотел бы поговорить о работе с Excel из C#.
Пара коментариев:
1. Я использую VS 2010 и Excel 2007.
2. Как я уже сказал, мне работа с Excel понадобилась в одном из проектов, поэтому примеры будут из этого проекта.
1. Для начала работы с Excel-ем, необходимо добавить ссылку на сборку Microsoft Excel 12.0 Object Library.
2. Подключаем с псевдонимом пространство имен:
using Excel = Microsoft.Office.Interop.Excel;
3. Загружаем в память новый экземпляр приложения:
Excel.Application excelApp = new Excel.Application(); excelApp.Visible = true; // Отвечает за то, будет ли видимо приложен4. Открываем ранее существующий документ:
excelApp.Workbooks.Open(_sourceFile.FullName);
А вот здесь, как уже увидили те кто раньше работали с Excel, радостная новость! Теперь c# поддерживает параметры по умолчанию! И никаких больше "миссинг валуе".
5. Свойство Workbooks, как это не странно, содержит открытые книги. Почитаем с первой страницы, первой открытой книги, строчки в список (да, я имею в виду именно первой, а не нулевой! Пользуясь случаем, передаю пламенный привет раработчикам Visual Basic, начинающих нуманацию элементов массива с 1).
int row = 1; List<List<string>> maping = new List<List<string>>(); Excel.Worksheet currentSheet = (Excel.Worksheet)excelApp.Workbooks[1].Worksheets[1]; while (currentSheet.get_Range("A" + row).Value2 != null) { List<string> tempList = new List<string>(); for (char column = 'A'; column < 'J'; column++) { Excel.Range cell = currentSheet.get_Range(column + row); tempList.Add(сell != null ? cell.Value2.ToString() : ""); } maping.Add(tempList); row++; }Вот таким нехитрым способом, мы отмапили из экселевского файла ячеки в двухмерный список, с которым дальше можно и работать, не прибегая, к всяким жутким ухищрениям.
Да, чуть не забыл, проверка в while, проверяет есть ли хоть что-то в первом столбце в текущей строке, если есть, то добро пожаловать в мапинг. если нет, то файл кончился (ну у меня просто файл такой, у вас может быть другое условие разбора. Например, нужно перетащить наперед заданное число строк, или как нибудь еще).
6. Закрываем Excel
excelApp.Quit();
На этом вроде бы и все, но как говорится: Следите за рекламой! В следующей части покажу как генерировать сложную таблицу (объединение ячеек и все такое) с нуля.
З.ы. Спасибо, одному моему коллеге, который напомнил, что надо писать в блог, а то что-то за лето, я действительно, расслабился...
Нашел код для загрузки данных Excel в таблицу DataGridView:
ОтветитьУдалитьprivate void завантажитиToolStripMenuItem_Click_1(object sender, EventArgs e)
{
{
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.DefaultExt = "*.xls;*.xlsx";
ofd.Filter = "Microsoft Excel (*.xls*)|*.xls*";
ofd.Title = "Выберите документ для загрузки данных";
if (ofd.ShowDialog() != DialogResult.OK)
{
MessageBox.Show("Вы не выбрали файл для открытия", "Загрузка данных...", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
String constr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +
ofd.FileName + ";Extended Properties='Excel 12.0 XML;HDR=YES;IMEX=1';";
System.Data.OleDb.OleDbConnection con = new System.Data.OleDb.OleDbConnection(constr);
con.Open();
DataSet ds = new DataSet();
DataTable schemaTable = con.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
string sheet1 = (string)schemaTable.Rows[0].ItemArray[2];
string select = String.Format("SELECT * FROM [{0}]", sheet1);
System.Data.OleDb.OleDbDataAdapter ad = new System.Data.OleDb.OleDbDataAdapter(select, con);
ad.Fill(ds);
DataTable dt = ds.Tables[0];
con.Close();
con.Dispose();
dataGridView1.DataSource = dt;
}
Все работает, НО!!! К уже готовой таблице DataGridView добавляет еще одну таблицу со смещение данных вправо. ПОМОГИТЕ