Откройте рабочую книгу.
грамматика
выражение . Open( FileName , UpdateLinks , ReadOnly , Format , Password , WriteResPassword , IgnoreReadOnlyRecommended , Origin , Delimiter , Editable , Notify , Converter , AddToMru , Local , CorruptLoad )
выражениеПредставительWorkbooksПеременные объекта.
параметры
Имя | Обязательно / необязательно | Тип данных | объяснение |
---|---|---|---|
FileName | опциональный | Variant | String. Имя файла рабочей книги, которую нужно открыть. |
UpdateLinks | опциональный | Variant | Укажите способ обновления внешних ссылок (ссылок) в файле, например, следующую формулу = SUM ([Budget.xls] Year! C10: C25) ссылка на определенную область в книге Budget.xls Если этот параметр не указан, пользователю предлагается указать метод обновления ссылки. Дополнительные сведения о значении, используемом для этого параметра, см. В разделе «Описание». Если Microsoft Excel открывает файл в формате WKS, WK1 или WK3, а параметр UpdateLinks равен 0, диаграмма не будет создана, в противном случае Microsoft Excel создаст диаграмму на основе графика, прикрепленного к файлу. |
ReadOnly | опциональный | Variant | Если True, книга открывается в режиме только для чтения. |
Format | опциональный | Variant | Если Microsoft Excel открывает текстовый файл, этот параметр указывает разделитель. Если этот параметр не указан, используется текущий разделитель. Дополнительные сведения о значении, используемом этим параметром, см. В разделе «Примечания». |
Password | опциональный | Variant | Строка, содержащая пароль, необходимый для открытия защищенной книги. Если этот параметр пропущен и в рабочей книге задан пароль, пользователю предлагается ввести пароль. |
WriteResPassword | опциональный | Variant | Строка, содержащая пароль, необходимый для записи в защищенную книгу. Если этот параметр пропущен и в рабочей книге задан пароль, пользователю предлагается ввести пароль. |
IgnoreReadOnlyRecommended | опциональный | Variant | Если этоTrue, Затем запретите Microsoft Excel отображать сообщение с предложением только для чтения (если рабочая книга«Рекомендуется только для чтения»Вариант сохранения). |
Origin | опциональный | Variant | Если файл является текстовым файлом, этот параметр используется для указания источника файла для правильного сопоставления кодовой страницы и возврата каретки / перевода строки (CR / LF)). Может быть следующимXlPlatformОдна из констант:xlMacintosh 、 xlWindowsилиxlMSDOS, Если этот параметр не указан, используется текущая операционная система. |
Delimiter | опциональный | Variant | Если файл является текстовым файлом, а параметр Format равен 6, этот параметр является строкой, которая указывает символ, используемый в качестве разделителя. Например, вы можете использоватьChr(9)Обозначает символ табуляции, используйте «,» для запятой, используйте «;» для точки с запятой или используйте пользовательский символ. Используется только первый символ строки. |
Editable | опциональный | Variant | Если файл является надстройкой Microsoft Excel 4.0, этот параметрTrueВы можете открыть надстройку, чтобы сделать ее видимой. Если этот параметрFalseЕсли он опущен, надстройка открывается в скрытом режиме и не может быть видна. Этот параметр нельзя применить к надстройкам, созданным в Microsoft Excel 5.0 или более поздней версии. Если файл является шаблоном Excel, а значение параметра «True», указанный шаблон будет открыт для редактирования. Когда значение параметра равно «Ложь», новую книгу можно открыть в соответствии с указанным шаблоном. Значением по умолчанию является «Ложь». |
Notify | опциональный | Variant | Когда файл не может быть открыт в режиме чтения-записи, если этот параметрTrueВы можете добавить файл в список уведомлений файла. Microsoft Excel откроет файл в режиме «только для чтения», опросит список уведомлений и уведомит пользователя, когда файл будет доступен. Если этот параметрFalseЕсли оно опущено, уведомление не запрашивается, и любые недоступные файлы не могут быть открыты. |
Converter | опциональный | Variant | Индекс первого конвертера файлов, который нужно попробовать при открытии файла. Указанный конвертер файлов пробуется в первую очередь, если конвертер не распознает файл, все остальные конвертеры будут опробованы. Конвертер индекс поFileConvertersНомер строки конвертера, возвращаемый атрибутом. |
AddToMru | опциональный | Variant | Если этоTrueЗатем добавьте книгу в список недавно использованных файлов. Значением по умолчанию являетсяFalse 。 |
Local | опциональный | Variant | Если этоTrue», Файл сохраняется на языке Microsoft Excel (включая настройки панели управления). Если этоFalse(По умолчанию), сохраните файл на языке Visual Basic для приложений (VBA) (VBA обычно является версией на английском языке для США, если проект VBA, из которого выполняется Workbooks.Open, не является старым международным проектом VBA XL5 / 95). |
CorruptLoad | опциональный | XlCorruptLoad | Может быть одной из следующих констант:xlNormalLoad 、 xlRepairFileиxlExtractData, Если значение не указано, поведение по умолчаниюxlNormalLoad, И не пытайтесь восстановить состояние при запуске через ОМ. |
Возвращаемое значение
Представитель открытой рабочей книгиWorkbookОбъект.
комментарий
По умолчанию макросы включаются при открытии файлов программно. использованиеAutomationSecurityАтрибуты могут устанавливать режим безопасности макросов, используемый при программном открытии файлов.
Вы можете указать одно из следующих значений в параметре UpdateLinks, чтобы определить, обновлять ли внешние ссылки (ссылки) при открытии книги.
значение | смысл |
---|---|
0 | Внешние ссылки (ссылки) не обновляются при открытии книги. |
3 | Обновлять внешние ссылки (ссылки) при открытии книги. |
Вы можете указать одно из следующих значений в параметре Format, чтобы определить символ разделителя файла.
значение | сепаратор |
---|---|
1 | тег |
2 | запятая |
3 | пустой |
4 | точка с запятой |
5 | нет |
6 | Пользовательские символы (см.DelimiterПараметр) |
примеров
В следующем примере кода открывается книга Analysis.xls, а затем запускается ее макрос Auto_Open.
Workbooks.Open "ANALYSIS.XLS"
ActiveWorkbook.RunAutoMacros xlAutoOpen
Пример кода провайдера: Bill Jelen, MrExcel.com
В следующем примере кода импортируется лист из другой книги в новый лист в текущей книге. Лист 1 текущей рабочей книги должен содержать путь к книге, которую нужно импортировать в ячейку D3, имя файла в ячейке D4 и имя листа в ячейке D5. Импортированный лист будет вставлен после Листа 1 в текущую книгу.
Sub ImportWorksheet()
' This macro will import a file into this workbook
Sheets("Sheet1").Select
PathName = Range("D3").Value
Filename = Range("D4").Value
TabName = Range("D5").Value
ControlFile = ActiveWorkbook.Name
Workbooks.Open Filename:=PathName &; Filename
ActiveSheet.Name = TabName
Sheets(TabName).Copy After:=Workbooks(ControlFile).Sheets(1)
Windows(Filename).Activate
ActiveWorkbook.Close SaveChanges:=False
Windows(ControlFile).Activate
End Sub
Трансфер из:https://msdn.microsoft.com/zh-cn/VBA/Excel-VBA/articles/workbooks-open-method-excel
Время на прочтение
7 мин
Количество просмотров 69K
В современном мире разработки приложений нередко встает необходимость работы с Excel документами. Чаще всего это разного рода отчеты, но иногда xls/x файлы используются в качестве хранилища данных. Например, если пользователь должен иметь возможность загрузить данные в приложение или выгрузить, в человеко-читаемом виде, Excel де-факто является стандартом. Относительно дружелюбный интерфейс, прозрачная структура, в купе с его распространенностью… трудно навскидку назвать решение лучше.
Однако, у многих Excel до сих пор ассоциируется с чем-то тяжелым, неповоротливым и сложным. Давайте посмотрим, как мы — обычные C# разработчики, можем легко сформировать простой Excel документ, на примере табличного отчета.
Историческая справка
Времена, когда доминировал проприетарный формат .xls(Excel Binary File Format) давно прошли и сейчас мы имеем только .xlsx(Excel Workbook), в рамках Office Open XML. Последний представляет собой обычный .zip архив с XML файлами. Не будем углубляться в его структуру, я искренне надеюсь что вам это никогда не понадобится.
На github, и не только, можно найти ряд библиотек, бесплатных и не только. Пожалуй самой популярной является EPPlus. До определенной степени, она довольно хорошо отражает концепцию Excel, именно по этому я всегда использую EPPlus. Версия 4 полностью бесплатна, начиная с 5‐й версии вам потребуется приобрести лицензию для коммерческого использования.
Задача
Итак, предположим, продукт-мэнеджеру ударила в голову идея того, что возможность выгружать некий отчет в формате Excel увеличит кол-во пользователей на 100500%. Проджет-менеджер решает выкатить эту киллер-фичу как хотфикс прямо сегодня — ведь работы всего на пару часов.
Сам по себе, отчет содержит краткое описание компании и историю изменения некоторых экономических показателей. Для простоты все свойства компании — строки. Экономические показатели — большие целые числа и числа с плавающей точкой, а также даты. Предположим, что где-то в недрах микросервисного backend-да есть сервис-генератор подобных отчетов, например по id компании. Однако, поскольку id нет смысла выводить пользователю, идентификатор отсутствует в самой модели отчета.
Аналитик, в свою очередь, выдает задачу с феноменально точным описанием — «Сгенерировать excel отчет на базе данных MarketReport». Что ж, для нашего примера, создадим заглушку — генератор фейковых данных:
Первый запуск
Подключим EPPlus версии 4.5.3.3 и создадим базовую обвязку для будущего генератора.
Сердцем генератора будет метод Generate. ExcelPackage это модель документа, через которую мы и будем осуществлять все взаимодействия с ним. Также имеется конструктор для передачи пути к файлу или потока.
В методе main создается генератор отчетов, а также генератор Excel файлов. Далее полученный файл просто записывается на диск.
При попытке запустить приложение, получаем exception:InvalidOperationException: The workbook must contain at least one worksheet
Все правильно, Excel документ не может существовать без страниц, должна быть хотя бы одна. Добавляем ее, все интуитивно понятно:
var sheet = package.Workbook.Worksheets
.Add("Market Report");
Запускаем снова и… вот оно! Теперь наше приложение генерирует документ и, хотя там еще ничего нет, он уже весит 2,5KB — значит мы работаем с Excel правильно и все идет как надо.
Вывод данных
Давайте выведем основную информацию по компании в шапку. Для доступа к конкретной ячейки объект Cells на странице пакета снабжен удобным индексатором. При этом, до конкретной ячейки можно достучаться как через номер строки и столбца, так и по привычному всем буквенно-числовому коду:
sheet.Cells["B2"].Value = "Company:";
sheet.Cells[2, 3].Value = report.Company.Name;
Полный код вывода шапки.
sheet.Cells["B2"].Value = "Company:";
sheet.Cells[2, 3].Value = report.Company.Name;
sheet.Cells["B3"].Value = "Location:";
sheet.Cells["C3"].Value = $"{report.Company.Address}, " +
$"{report.Company.City}, " +
$"{report.Company.Country}";
sheet.Cells["B4"].Value = "Sector:";
sheet.Cells["C4"].Value = report.Company.Sector;
sheet.Cells["B5"].Value = report.Company.Description;
Для вывода исторических данных понадобится как минимум шапка таблицы и цикл по массиву History:
sheet.Cells[8, 2, 8, 4].LoadFromArrays(new object[][]{ new []{"Capitalization", "SharePrice", "Date"} });
var row = 9;
var column = 2;
foreach (var item in report.History)
{
sheet.Cells[row, column].Value = item.Capitalization;
sheet.Cells[row, column + 1].Value = item.SharePrice;
sheet.Cells[row, column + 2].Value = item.Date;
row++;
}
Предлагаю обратить внимание на метод LoadFromArrays, который заполняет диапазон ячеек рваным(зубчатым) массивом. Здесь мы можем видеть, что типизация теряется и передавая массив object мы ожидаем что EPPlus в конечном итоге использует ToString, чтобы записать переданное в ячейки.
Стилизация
Если вы прямо сейчас откроете документ, то вы возможно увидите не то, что хотелось бы отдать в продакшн в пятницу вечером.
Как это выглядит
Во-первых, шапка никак не выделяется, во-вторых таблица не имеет границ… выравнивание пляшет, даты отображаются магическими числами, а капитализация «уходит в какую-то математику» — как это прокомментировал аналитик.
Да, на все эти красивости у нас уйдет больше года кода, чем на сам вывод данных, и, в конечном тоге, получившаяся каша из логики вывода данных и разметки заставит некоторых усомниться в их компетентности… но, мы же backend разработчики, так давайте сверстаем Excel Sheet!
Размер ячеек
Из коробки у нас есть возможность сделать автофит а так же вручную выставить ширину в соответствии с нашей ситуацией. А ситуация у нас не самая хорошая — по задумке аналитика в шапке у ячеек должен быть автофит, а у ячеек таблицы — тоже автофит. Так в чем же подвох?
Если вы когда-нибудь до этого открывали Excel, то возможно знаете, что ширина ячеек не может отличаться в рамках столбца и автофит будет по самому широкому контенту ячейки. Однако, простые вещи бывает нетак то просто объяснить… Но если вы справитесь, то вот как это будет выглядеть в коде:
sheet.Cells[1, 1, row, column + 2].AutoFitColumns();
sheet.Column(2).Width = 14;
sheet.Column(3).Width = 12;
Формат данных
Как и большая часть стиля ячейки, он задается через одноименное свойство Style. Обратите внимание на вычисление 3-го аргумента индексатора. Это звоночек некачественного кода, но к этому мы вернемся в позже…
sheet.Cells[9, 4, 9 + report.History.Length, 4].Style.Numberformat.Format = "yyyy";
sheet.Cells[9, 2, 9 + report.History.Length, 2].Style.Numberformat.Format = "### ### ### ##0";
Выравнивание
Его можно задать как на ячейке, так и на диапазоне. На самом деле, для EPPlus, это одна и та же сущность — некий ExcelRange, описывающий диапазон ячеек, в том числе и со всего 1 ячейкой.
sheet.Column(2).Style.HorizontalAlignment = ExcelHorizontalAlignment.Left;
sheet.Cells[8, 3, 8 + report.History.Length, 3].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
Стиль текста
Также легко задается, используя Style.Font, кстати, здесь, на 2-й строчке, мы впервые указываем диапазон так, как привыкли его видеть пользователи Excel:
sheet.Cells[8, 2, 8, 4].Style.Font.Bold = true;
sheet.Cells["B2:C4"].Style.Font.Bold = true;
Границы
Задаем стиль линии, а также ее толщину. К этому моменту от кол-ва магических чисел-параметров индексатора уже рябит в глазах, но мы уже на финишной прямой… не так ли?
sheet.Cells[8, 2, 8 + report.History.Length, 4].Style.Border.BorderAround(ExcelBorderStyle.Double);
sheet.Cells[8, 2, 8, 4].Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
График
«Ну что за отчет без графиков, верно, Карл?» — ловко подметит специалист по тестированию, и не важно, что этого не было в ТЗ а на часах уже половина 9-го…
Хотя график как сущность сам по себе сложнее таблиц и с графиками мы не работаем каждый день, EPPlus предоставляет довольно понятный API. Давайте добавим простейший график, отражающий рост капитализации:
var capitalizationChart = sheet.Drawings.AddChart("FindingsChart", OfficeOpenXml.Drawing.Chart.eChartType.Line);
capitalizationChart.Title.Text = "Capitalization";
capitalizationChart.SetPosition(7, 0, 5, 0);
capitalizationChart.SetSize(800, 400);
var capitalizationData = (ExcelChartSerie)(capitalizationChart.Series.Add(sheet.Cells["B9:B28"], sheet.Cells["D9:D28"]));
capitalizationData.Header = report.Company.Currency;
Еще, может понадобиться защитить страницу от редактирования:
sheet.Protection.IsProtected = true;
На этом все, репозиторий с рабочим приложением находится здесь.
Заключение
О чем говорит финальная версия метода Generate?
public byte[] Generate(MarketReport report)
{
var package = new ExcelPackage();
var sheet = package.Workbook.Worksheets
.Add("Market Report");
sheet.Cells["B2"].Value = "Company:";
sheet.Cells[2, 3].Value = report.Company.Name;
sheet.Cells["B3"].Value = "Location:";
sheet.Cells["C3"].Value = $"{report.Company.Address}, " +
$"{report.Company.City}, " +
$"{report.Company.Country}";
sheet.Cells["B4"].Value = "Sector:";
sheet.Cells["C4"].Value = report.Company.Sector;
sheet.Cells["B5"].Value = report.Company.Description;
sheet.Cells[8, 2, 8, 4].LoadFromArrays(new object[][]{ new []{"Capitalization", "SharePrice", "Date"} });
var row = 9;
var column = 2;
foreach (var item in report.History)
{
sheet.Cells[row, column].Value = item.Capitalization;
sheet.Cells[row, column + 1].Value = item.SharePrice;
sheet.Cells[row, column + 2].Value = item.Date;
row++;
}
sheet.Cells[1, 1, row, column + 2].AutoFitColumns();
sheet.Column(2).Width = 14;
sheet.Column(3).Width = 12;
sheet.Cells[9, 4, 9+ report.History.Length, 4].Style.Numberformat.Format = "yyyy";
sheet.Cells[9, 2, 9+ report.History.Length, 2].Style.Numberformat.Format = "### ### ### ##0";
sheet.Column(2).Style.HorizontalAlignment = ExcelHorizontalAlignment.Left;
sheet.Cells[8, 3, 8 + report.History.Length, 3].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
sheet.Column(4).Style.HorizontalAlignment = ExcelHorizontalAlignment.Right;
sheet.Cells[8, 2, 8, 4].Style.Font.Bold = true;
sheet.Cells["B2:C4"].Style.Font.Bold = true;
sheet.Cells[8, 2, 8 + report.History.Length, 4].Style.Border.BorderAround(ExcelBorderStyle.Double);
sheet.Cells[8, 2, 8, 4].Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
var capitalizationChart = sheet.Drawings.AddChart("FindingsChart", OfficeOpenXml.Drawing.Chart.eChartType.Line);
capitalizationChart.Title.Text = "Capitalization";
capitalizationChart.SetPosition(7, 0, 5, 0);
capitalizationChart.SetSize(800, 400);
var capitalizationData = (ExcelChartSerie)(capitalizationChart.Series.Add(sheet.Cells["B9:B28"], sheet.Cells["D9:D28"]));
capitalizationData.Header = report.Company.Currency;
sheet.Protection.IsProtected = true;
return package.GetAsByteArray();
}
Во-первых, прежде всего, о том, что мы успешно справились с задачей, а именно, сгенерировали свой первый Excel отчет, поработали со стилями и даже решили пару попутных проблем.
Во-вторых, возможно имеет смысл искать новою работу, но, забегая вперед, я бы с этим не спешил… Если данная публикация наберет 1+ просмотров, то во второй части мы поговорим о том, как можно отделить стилизацию от логики заполнения данными, упростить манипуляции над ячейками и в целом сделаем код боле поддерживаемым.
I am trying to convert some VBA code to C#. I am new to C#. Currently I am trying to open an Excel file from a folder and if it does not exist then create it. I am trying something like the following. How can I make it work?
Excel.Application objexcel;
Excel.Workbook wbexcel;
bool wbexists;
Excel.Worksheet objsht;
Excel.Range objrange;
objexcel = new Excel.Application();
if (Directory("C:\csharp\error report1.xls") = "")
{
wbexcel.NewSheet();
}
else
{
wbexcel.Open("C:\csharp\error report1.xls");
objsht = ("sheet1");
}
objsht.Activate();
abatishchev
97.3k85 gold badges297 silver badges432 bronze badges
asked Jan 21, 2009 at 11:25
4
You need to have installed Microsoft Visual Studio Tools for Office (VSTO).
VSTO can be selected in the Visual Studio installer under Workloads > Web & Cloud > Office/SharePoint Development.
After that create a generic .NET project and add a reference to Microsoft.Office.Interop.Excel
via ‘Add Reference… > Assemblies’ dialog.
Application excel = new Application();
Workbook wb = excel.Workbooks.Open(path);
Missing.Value
is a special reflection struct for unnecessary parameters replacement
In newer versions, the assembly reference required is called Microsoft Excel 16.0 Object Library
. If you do not have the latest version installed you might have Microsoft Excel 15.0 Object Library
, or an older version, but it is the same process to include.
answered Jan 21, 2009 at 15:07
abatishchevabatishchev
97.3k85 gold badges297 silver badges432 bronze badges
13
FileInfo fi = new FileInfo("C:\test\report.xlsx");
if(fi.Exists)
{
System.Diagnostics.Process.Start(@"C:testreport.xlsx");
}
else
{
//file doesn't exist
}
answered Oct 18, 2011 at 21:49
MennanMennan
4,42112 gold badges53 silver badges86 bronze badges
4
private void btnChoose2_Click(object sender, EventArgs e)
{
OpenFileDialog openfileDialog1 = new OpenFileDialog();
if (openfileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
this.btnChoose2.Text = openfileDialog1.FileName;
String filename = DialogResult.ToString();
var excelApp = new Excel.Application();
excelApp.Visible = true;
excelApp.Workbooks.Open(btnChoose2.Text);
}
}
LarsTech
80.3k14 gold badges151 silver badges222 bronze badges
answered Jan 28, 2014 at 17:45
FlaneFlane
1111 silver badge3 bronze badges
1
Imports
using Excel= Microsoft.Office.Interop.Excel;
using Microsoft.VisualStudio.Tools.Applications.Runtime;
Here is the code to open an excel sheet using C#.
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook wbv = excel.Workbooks.Open("C:\YourExcelSheet.xlsx");
Microsoft.Office.Interop.Excel.Worksheet wx = excel.ActiveSheet as Microsoft.Office.Interop.Excel.Worksheet;
wbv.Close(true, Type.Missing, Type.Missing);
excel.Quit();
Here is a video mate on how to open an excel worksheet using C# https://www.youtube.com/watch?v=O5Dnv0tfGv4
answered Aug 20, 2016 at 0:39
0
For opening a file, try this:
objexcel.Workbooks.Open(@"C:YourPathYourExcelFile.xls",
missing, missing, missing, missing, missing, missing, missing,
missing, missing, missing, missing, missing,missing, missing);
You must supply those stupid looking ‘missing’ arguments. If you were writing the same code in VB.Net you wouldn’t have needed them, but you can’t avoid them in C#.
answered Jan 21, 2009 at 11:39
2
you should open like this
Excel.Application xlApp ;
Excel.Workbook xlWorkBook ;
Excel.Worksheet xlWorkSheet ;
object misValue = System.Reflection.Missing.Value;
xlApp = new Excel.ApplicationClass();
xlWorkBook = xlApp.Workbooks.Open("csharp.net-informations.xls", 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "t", false, false, 0, true, 1, 0);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
source : http://csharp.net-informations.com/excel/csharp-open-excel.htm
ruden
answered Apr 17, 2013 at 6:23
0
It’s easier to help you if you say what’s wrong as well, or what fails when you run it.
But from a quick glance you’ve confused a few things.
The following doesn’t work because of a couple of issues.
if (Directory("C:\csharp\error report1.xls") = "")
What you are trying to do is creating a new Directory object that should point to a file and then check if there was any errors.
What you are actually doing is trying to call a function named Directory() and then assign a string to the result. This won’t work since 1/ you don’t have a function named Directory(string str) and you cannot assign to the result from a function (you can only assign a value to a variable).
What you should do (for this line at least) is the following
FileInfo fi = new FileInfo("C:\csharp\error report1.xls");
if(!fi.Exists)
{
// Create the xl file here
}
else
{
// Open file here
}
As to why the Excel code doesn’t work, you have to check the documentation for the Excel library which google should be able to provide for you.
answered Jan 21, 2009 at 14:57
Mats FredrikssonMats Fredriksson
19.6k6 gold badges36 silver badges57 bronze badges
Microsoft.Office.Interop.Excel.Application excapp;
excapp = new Microsoft.Office.Interop.Excel.Application();
object misval=System.Reflection.Missing.Value;
Workbook wrkbuk = new Workbook();
Worksheet wrksht = new Worksheet();
wrkbuk = excapp.Workbooks._Open(@"C:Users......_template_v1.0.xlsx", misval, misval,
misval, misval, misval, misval, misval, misval, misval, misval, misval, misval);
wrksht = (Microsoft.Office.Interop.Excel.Worksheet)wrkbuk.Worksheets.get_Item(2);
RememberME
2,0823 gold badges37 silver badges62 bronze badges
answered Jul 15, 2011 at 10:50
Is this a commercial application or some hobbyist / open source software?
I’m asking this because in my experience, all free .NET Excel handling alternatives have serious problems, for different reasons. For hobbyist things, I usually end up porting jExcelApi from Java to C# and using it.
But if this is a commercial application, you would be better off by purchasing a third party library, like Aspose.Cells. Believe me, it totally worths it as it saves a lot of time and time ain’t free.
answered Jan 21, 2009 at 15:29
Tamas CzinegeTamas Czinege
118k40 gold badges148 silver badges175 bronze badges
Code :
private void button1_Click(object sender, EventArgs e)
{
textBox1.Enabled=false;
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Excell File |*.xlsx;*,xlsx";
if (ofd.ShowDialog() == DialogResult.OK)
{
string extn = Path.GetExtension(ofd.FileName);
if (extn.Equals(".xls") || extn.Equals(".xlsx"))
{
filename = ofd.FileName;
if (filename != "")
{
try
{
string excelfilename = Path.GetFileName(filename);
}
catch (Exception ew)
{
MessageBox.Show("Errror:" + ew.ToString());
}
}
}
}
answered Jan 12, 2015 at 6:54
For editing Excel files from within a C# application, I recently started using NPOI.
I’m very satisfied with it.
answered Apr 4, 2012 at 15:06
bvgheluwebvgheluwe
8537 silver badges25 bronze badges
Все привет, в этой статье опишу исчерпывающие примеры работы с excel на языке C#.
Для начала работы нам необходимо подключить библиотеку COM как на рисунке ниже:
Для этого добавляем ссылку в проект, надеюсь вы знаете как это делается) Выбираем пункт COM ищем библиотеку Microsoft Excel 16.0 Object Library ставим галочку и жмем Ок.
Далее нам не обходимо для сокращения записи и удобства создать алиас.
using Excel = Microsoft.Office.Interop.Excel; |
Теперь нам нужно объявить объект Excel задать параметры и приступать к работе.
//Объявляем приложение Excel.Application app = new Excel.Application { //Отобразить Excel Visible = true, //Количество листов в рабочей книге SheetsInNewWorkbook = 2 }; //Добавить рабочую книгу Excel.Workbook workBook = app.Workbooks.Add(Type.Missing); //Отключить отображение окон с сообщениями app.DisplayAlerts = false; //Получаем первый лист документа (счет начинается с 1) Excel.Worksheet sheet = (Excel.Worksheet)app.Worksheets.get_Item(1); //Название листа (вкладки снизу) sheet.Name = «Имя должно быть не больше 32сим»; |
Пример заполнения ячейки:
//Пример заполнения ячеек №1 for (int i = 1; i <= 9; i++) { for (int j = 1; j < 9; j++) sheet.Cells[i, j] = String.Format(«nookery {0} {1}», i, j); } //Пример №2 sheet.Range[«A1»].Value = «Пример №2»; //Пример №3 sheet.get_Range(«A2»).Value2 = «Пример №3»; |
Захват диапазона ячеек:
//Захватываем диапазон ячеек Вариант №1 Excel.Range r1 = sheet.Cells[1, 1]; Excel.Range r2 = sheet.Cells[9, 9]; Excel.Range range1 = sheet.get_Range(r1, r2); //Захватываем диапазон ячеек Вариант №2 Excel.Range range2 = sheet.get_Range(«A1»,«H9» ); |
Оформление, шрифт, размер, цвет, толщина.
//Шрифт для диапазона range.Cells.Font.Name = «Tahoma»; range2.Cells.Font.Name = «Times New Roman»; //Размер шрифта для диапазона range.Cells.Font.Size = 10; //Жирный текст range.Font.Bold = true; //Цвет текста range.Font.Color = ColorTranslator.ToOle(Color.Blue); |
Объединение ячеек в одну
//Объединение ячеек с F2 по K2 Excel.Range range3 = sheet.get_Range(«F2», «K2»); range3.Merge(Type.Missing); |
Изменяем размеры ячеек по ширине и высоте
//увеличиваем размер по ширине диапазон ячеек Excel.Range range2 = sheet.get_Range(«D1», «S1»); range2.EntireColumn.ColumnWidth = 10; //увеличиваем размер по высоте диапазон ячеек Excel.Range rowHeight = sheet.get_Range(«A4», «S4»); rowHeight.EntireRow.RowHeight = 50;range.EntireColumn.AutoFit();range.EntireColumn.AutoFit(); //авторазмер |
Создаем обводку диапазона ячеек
Excel.Range r1 = sheet.Cells[countRow, 2]; Excel.Range r2 = sheet.Cells[countRow, 19]; Excel.Range rangeColor = sheet.get_Range(r1, r2); rangeColor.Borders.Color = ColorTranslator.ToOle(Color.Black); |
Производим выравнивания содержимого диапазона ячеек.
Excel.Range r = sheet.get_Range(«A1», «S40»); //Оформления r.Font.Name = «Calibri»; r.Cells.Font.Size = 10; r.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter; r.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter; |
Примеры вычисления формул, все вставки формул были скопированы из самой Excel без изменений. Позиция ячейки взята из счетчика переменно и подставлен к букве ячейки
sheet.Cells[countRow, countColumn] = $«=G{countRow}-F{countRow}»; sheet.Cells[countRow, countColumn].FormulaLocal = $«=ЕСЛИ((H{countRow}*O{countRow})+(I{countRow}*P{countRow})/100<=0;J{countRow}*O{countRow}/100;((H{countRow}*O{countRow})+(I{countRow}*P{countRow}))/100)»; sheet.Cells[countRow, countColumn] = $«=K{countRow}+N{countRow}-R{countRow}»; sheet.Cells[33, 22].FormulaLocal = «=СУММ(V3:V32)»; |
Добавляем разрыв страницы.
//Ячейка, с которой будет разрыв Excel.Range razr = sheet.Cells[n, m] as Excel.Range; //Добавить горизонтальный разрыв (sheet — текущий лист) sheet.HPageBreaks.Add(razr); //VPageBreaks — Добавить вертикальный разрыв |
Как открыть фаил Excel
app.Workbooks.Open(@»C:UsersUserDocumentsExcel.xlsx», Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); |
Сохраняем документ Excel
app.Application.ActiveWorkbook.SaveAs(«MyFile.xlsx», Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); |
Завершение работы с объектом Excel.Application
app.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(app); |
Пример как выбрать фаил и загрузив его и узнать количество заполненных строк и колонок в одном конкретном листе по имени.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
//поиск файла Excel OpenFileDialog ofd = new OpenFileDialog(); ofd.Multiselect =false; ofd.DefaultExt = «*.xls;*.xlsx»; ofd.Filter = «Microsoft Excel (*.xls*)|*.xls*»; ofd.Title = «Выберите документ Excel»; if (ofd.ShowDialog() != DialogResult.OK) { MessageBox.Show(«Вы не выбрали файл для открытия», «Внимание», MessageBoxButtons.OK, MessageBoxIcon.Information); return; } string xlFileName = ofd.FileName; //имя нашего Excel файла //рабоата с Excel Excel.Range Rng; Excel.Workbook xlWB; Excel.Worksheet xlSht; int iLastRow, iLastCol; Excel.Application xlApp = new Excel.Application(); //создаём приложение Excel xlWB = xlApp.Workbooks.Open(xlFileName); //открываем наш файл xlSht = xlWB.Worksheets[«Лист1»]; //или так xlSht = xlWB.ActiveSheet //активный лист iLastRow = xlSht.Cells[xlSht.Rows.Count, «A»].End[Excel.XlDirection.xlUp].Row; //последняя заполненная строка в столбце А iLastCol = xlSht.Cells[1, xlSht.Columns.Count].End[Excel.XlDirection.xlToLeft].Column; //последний заполненный столбец в 1-й строке |
Получаем список всех загруженных книг «листов» из файла
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//поиск файла Excel OpenFileDialog ofd = new OpenFileDialog(); ofd.Multiselect = false; ofd.DefaultExt = «*.xls;*.xlsx»; ofd.Filter = «Microsoft Excel (*.xls*)|*.xls*»; ofd.Title = «Выберите документ Excel»; if (ofd.ShowDialog() != DialogResult.OK) { MessageBox.Show(«Вы не выбрали файл для открытия», «Внимание», MessageBoxButtons.OK, MessageBoxIcon.Information); return; } string xlFileName = ofd.FileName; //имя нашего Excel файла Excel.Workbook xlWB = ex.Workbooks.Open(xlFileName); ///загружаем список всех книг foreach (object item in xlWB.Sheets) { Excel.Worksheet sheet = (Excel.Worksheet)item; } |
Метод Workbook. Open (Excel)
‘\———————————————————————————————————-
Excel поддерживает возможность открытия URL-адреса в качестве другой книги Excel с помощью Workbooks.Open method:
Из MSDN:
Sub OpenUSDRatesPage()
Dim objBK As Workbook
Dim objRng As Range
‘Open the page as a workbook.
Set objBK = Workbooks.Open(«http://www.x-rates.com/tables/USD.HTML»)
‘Find the Canadian Dollar cell.
Set objRng = objBK.Worksheets(1).Cells.Find(«Canadian Dollar»)
‘Retrieve the exchange rate.
MsgBox «The CAD/USD exchange rate is » & objRng.Offset(-6, -1).Value
End Sub
‘\—————————————————————————————————————
Метод Workbook. Open (Excel)
- 18.05.2019
Открывает книгу.
Синтаксис
Expression. Open (открыть ) (Filename, UpdateLinks, ReadOnly, Format, Password, вритереспассворд, игноререадонлирекоммендед, Origin,- Limit, редактируемый, _Notify _, Converter, аддтомру, Local, корруптлоад)
Expression (выражение ) Переменная, представляющая объект книги .
Параметры
Имя |
Обязательный или необязательный |
Тип данных |
Описание |
FileName |
Необязательный |
Variant |
Строка. Имя файла книги, которую необходимо открыть. |
UpdateLinks |
Необязательный |
Variant |
Задает способ обновления внешних ссылок (ссылок) в файле (например, ссылки на диапазон в книге бюджет. xls в следующей формуле =SUM([Budget.xls]Annual!C10:C25)). Если этот аргумент не указан, пользователю предлагается указать, как будут обновляться ссылки. Для получения дополнительных сведений о значениях, используемых этим параметром, обратитесь к разделу «Примечания». Если Microsoft Excel открывает файл в формате WKS, WK1 или WK3, а аргумент UpdateLinks имеет значение 0, диаграммы не создаются; в противном случае Microsoft Excel создает диаграммы на основе диаграмм, вложенных в файл. |
ReadOnly |
Необязательно устанавливать. |
Variant |
Значение true, чтобы открыть книгу в режиме только для чтения. |
Format |
Необязательный |
Variant |
Если Microsoft Excel открывает текстовый файл, этот аргумент задает символ разделителя. Если этот аргумент не указан, используется текущий разделитель. Для получения дополнительных сведений о значениях, используемых этим параметром, обратитесь к разделу «Примечания». |
Password |
Необязательный |
Variant |
Строка, содержащая пароль, необходимый для открытия защищенной книги. Если этот аргумент опущен и для книги требуется пароль, пользователю предлагается ввести пароль. |
Вритереспассворд |
Необязательный |
Variant |
Строка, содержащая пароль, необходимый для записи в книгу, зарезервированную для записи. Если этот аргумент опущен и для книги требуется пароль, пользователю будет выдан запрос на ввод пароля. |
Игноререадонлирекоммендед |
Необязательный |
Variant |
True , чтобы Microsoft Excel не отображал рекомендуемое только для чтения сообщение (рекомендуется ли книга была сохранена с помощью параметра » только для чтения «). |
Основания |
Необязательный |
Variant |
Если файл является текстовым, этот аргумент указывает на то, где он был создан, чтобы страницы кода и возврат каретки/перевод строки (CR/LF) могли быть сопоставлены правильно. Может быть одной из следующих констант кслплатформ : кслмаЦинтош, кслвиндовсили кслмсдос. Если этот аргумент не указан, используется текущая операционная система. |
Разделитель |
Необязательный |
Variant |
Если файл является текстовым файлом, а аргумент Format имеет значение 6, этот аргумент представляет собой строку, задающую символ, который будет использоваться в качестве разделителя. Например, используйте Chr (9) для табуляции, используйте «,» для запятых, введите «;» для точки с запятой или используйте специальный символ. Используется только первый символ строки. |
Изменяемость |
Необязательный |
Variant |
Если файл является надстройкой Microsoft Excel 4,0, этот аргумент имеет значение true , чтобы открыть надстройку, чтобы она стала видимым окном. Если этот аргумент имеет значение false или опущен, надстройка открывается как скрытая и не может быть скрыта. Этот параметр не применяется к надстройкам, созданным в Microsoft Excel 5,0 или более поздней версии. Если файл является шаблоном Excel, имеет значение true , чтобы открыть указанный шаблон для редактирования. Значение false , чтобы открыть новую книгу на основе указанного шаблона. Значение по умолчанию — False. |
Уведомления |
Необязательный |
Variant |
Если файл не может быть открыт в режиме чтения и записи, этот аргумент имеет значение true , чтобы добавить файл в список уведомлений о файле. Microsoft Excel откроет файл как доступный только для чтения, опросить список уведомлений о файле, а затем уведомить пользователя, когда файл станет доступен. Если этот аргумент имеет значение false или опущено, уведомления не запрашиваются, а все попытки открыть недоступный файл завершатся ошибкой. |
Счет |
Необязательный |
Variant |
Индекс первого конвертера файлов, который будет пытаться открыть файл. Заданный конвертер файлов сначала пытается выполнить операцию. Если этот конвертер не распознает файл, попытаются выполнить все другие конвертеры. Индекс преобразователя состоит из номеров строк преобразователей, возвращаемых свойством FileConverters . |
Аддтомру |
Необязательный |
Variant |
Значение true , чтобы добавить эту книгу в список недавно использовавшихся файлов. Значение по умолчанию — False. |
Local |
Необязательный |
Variant |
True — сохраняет файлы на языке Microsoft Excel (включая параметры панели управления). False (ложь ) (по умолчанию) — сохранение файлов на языке Visual Basic для приложений (VBA) (как правило, это английская версия, если проект VBA, в котором запущены книги, не является устаревшим международным проектом XL5/95 VBA). |
Корруптлоад |
При необходимости |
XlCorruptLoad |
Может быть одной из следующих констант: кслнормаллоад, кслрепаирфиле и кслекстрактдата. Поведение по умолчанию, если значение параметра не указано, не равно кслнормаллоади не выполняет восстановление при запуске с помощью объектной модели. |
Возвращаемое значение
Объект книги , представляющий открытую книгу.
Примечания
По умолчанию при открытии файлов программным способом включаются макросы. Используйте свойство аутоматионсекурити , чтобы задать режим безопасности макросов, используемый при программном открытии файлов.
В параметре UpdateLinks можно указать одно из следующих значений, чтобы определить, обновляются ли внешние ссылки (ссылки) при открытии книги.
Значение |
Описание |
нуль |
Внешние ссылки (ссылки) не будут обновляться при открытии книги. |
4 |
Внешние ссылки (ссылки) будут обновляться при открытии книги. |
Чтобы определить символ разделителя для файла, можно указать одно из следующих значений в параметре Format .
Значение |
Разделитель |
1,1 |
Вкладки |
2 |
Запятыми |
4 |
Бель |
SP4 |
Запятой |
17:00 |
Отсутствует |
6 |
Настраиваемый символ (см. аргумент- Разделитель ) |
Пример
Следующий пример кода открывает книгу Analysis. xls и выполняет свой макрос Ауто_опен.
VB
Workbooks.Open «ANALYSIS.XLS»
ActiveWorkbook.RunAutoMacros xlAutoOpen
В приведенном ниже примере кода показано, как импортировать лист из другой книги на новый лист в текущей книге. Лист1 в текущей книге должен содержать имя пути к книге, которую необходимо импортировать, в ячейке D3, имя файла в ячейке D4, а имя листа в ячейке D5. Импортированный лист вставляется после Лист1 в текущей книге.
VB
Sub ImportWorksheet()
‘ This macro will import a file into this workbook
Sheets(«Sheet1»).Select
PathName = Range(«D3»).Value
Filename = Range(«D4»).Value
TabName = Range(«D5»).Value
ControlFile = ActiveWorkbook.Name
Workbooks.Open Filename:=PathName & Filename
ActiveSheet.Name = TabName
Sheets(TabName).Copy After:=Workbooks(ControlFile).Sheets(1)
Windows(Filename).Activate
ActiveWorkbook.Close SaveChanges:=False
Windows(ControlFile).Activate
End Sub
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.