Is there a way to save changes to an excel spreadsheet through the excel interop (in this case I am adding a worksheet to it) without having it prompt the user if they want to overwrite the existing file with the changes. I do not want the user to even see the spreadsheet open in my application so having a message box popping up asking them if they want to overwrite the file seems very out of place and possibly confusing to the user.
I am using the workbook.SaveAs(fileloaction) method.
Here is where I am initializing the COM reference objects for the excel interop.
private Excel.Application app = null;
private Excel.Workbook workbook = null;
public Excel.Workbook Workbook
{
get { return workbook; }
set { workbook = value; }
}
private Excel.Worksheet worksheet = null;
private Excel.Range workSheet_range = null;
Below is the code I am using to close/save the excel file. The workbook.close() method line is the one that is reportedly throwing the unhandled exception.
workbook.Close(true, startForm.excelFileLocation, Missing.Value);
Marshal.ReleaseComObject(app);
app = null;
System.GC.Collect();
asked Oct 24, 2012 at 18:24
user1546315user1546315
6735 gold badges16 silver badges27 bronze badges
Basically, all you need is ExcelApp.DisplayAlerts = False — Here’s how I do it, though:
ExcelApp.DisplayAlerts = False
ExcelWorkbook.Close(SaveChanges:=True, Filename:=CurDir & FileToSave)
Hope this helps
answered Oct 24, 2012 at 18:29
John BustosJohn Bustos
18.9k16 gold badges87 silver badges148 bronze badges
5
Only this code will Require for stop override alert or Template already in use
ExcelApp.DisplayAlerts = False
answered Aug 29, 2013 at 5:57
I know this is an old post, but I wanted to share a way to make this work without causing possible frustration in the future.
First what I do not like about using: ExcelApp.DisplayAlerts = False
Setting this flag will set this property on the excel file, not just in your program. This means that if a user makes changes to the file and closes it (by clicking the X), they will not be prompted to save the file and will cause frustration later. It will also disable any other prompts excel would typically post.
I like checking if the file exists before saving it:
if (File.Exists(SaveAsName))
{
File.Delete(SaveAsName);
}
answered Nov 19, 2015 at 14:27
1
Ma_Russia, У меня вопрос. Какая версия Excel у вас установлена на компьютере?
Предлагаю следующие варианты Excel 97, 2000, 2003, 2007, 2010, 2013, 2016.
Если у вас установлена одна из версий 2007, 2010, 2013, 2016, то почему вы сохраняете с форматом XLS?
Аргумент XlFileFormat.xlWorkbookDefault говорит «необходимо сохранить файл с форматом «XLSX»
Вам нужно сперва определится какая версия Excel у вас стоит и с каким форматом вы хотите сохранить файл
Я сейчас переписал ваш код немного. Попробуйте его.
Напишите эту строку в самом верху
using Excel = Microsoft.Office.Interop.Excel;
почитайте комментарии в коде.
Если вам надо сохранить файл именно в формате Excel 2003, то раскомментируйте этот блок, а другой блок, который сохраняет в формате Excel 2007 наоборот закомментируйте.
и укажите свой путь к сохранению файла.
У меня установлен Excel 2013, соответственно я сохраняю файл в формат Excel 2007 (XLSX)
C# | ||
|
Не по теме: я не советую вам сохранять данные из DataGridView таким способом — бегая циклом по ячейкам листа Excel. Это очень медленный способ. Нужно сперва данные загружать в двумерный массив из DataGridView, а потом одной строкой выгружать их на лист в Excel
- Remove From My Forums
-
Question
-
Hey,
I’m manipulating an Excel (.xls) file trough C#, and I’m using this function the save the file in the end of my program:
excelWS.SaveAs(@path, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing);
But after it the windows prompt asking to the user if he would like to overwrite the existing file (because i’m saving it with the same name as before).
I’d like to know if there’s a way to always overwrite the file, without asking to the user.
Regards
Answers
-
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); excel.DisplayAlerts = false; excelSheePrint.SaveAs(filename, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookDefault, Type.Missing, Type.Missing, true, false, XlSaveAsAccessMode.xlNoChange, XlSaveConflictResolution.xlLocalSessionChanges, Type.Missing, Type.Missing); If (My Answer) Please mark the replies as answer. Thanks; Else Thank you all the same; My Code Blog:http://nauhil.wordpress.com/
-
Proposed as answer by
Friday, April 30, 2010 1:23 PM
-
Marked as answer by
Henrique Nunes
Friday, April 30, 2010 2:44 PM
-
Proposed as answer by
-
As a work around
you use File.Exist() to check whether is there any file avaible with the same name, then just delete it File.Delete
that is the only way left. i’m adding sample code. {found here
http://www.daniweb.com/forums/thread208167.html }-
Marked as answer by
Henrique Nunes
Friday, April 30, 2010 2:44 PM
-
Marked as answer by
Оставляю заметку по работе с Excel с помощью C#.
Привожу фрагменты кода, которые искал когда-то сам для работы с Excel документами.
Наработки очень пригодились в работе для формирования отчетности.
Прежде всего нужно подключить библиотеку Microsoft.Office.Interop.Excel.
Далее создаем псевдоним для работы с Excel:
using Excel = Microsoft.Office.Interop.Excel;
//Объявляем приложение Excel.Application ex = new Microsoft.Office.Interop.Excel.Application(); //Отобразить Excel ex.Visible = true; //Количество листов в рабочей книге ex.SheetsInNewWorkbook = 2; //Добавить рабочую книгу Excel.Workbook workBook = ex.Workbooks.Add(Type.Missing); //Отключить отображение окон с сообщениями ex.DisplayAlerts = false; //Получаем первый лист документа (счет начинается с 1) Excel.Worksheet sheet = (Excel.Worksheet)ex.Worksheets.get_Item(1); //Название листа (вкладки снизу) sheet.Name = "Отчет за 13.12.2017"; //Пример заполнения ячеек for (int i = 1; i <= 9; i++) { for (int j = 1; j < 9; j++) sheet.Cells[i, j] = String.Format("Boom {0} {1}", i, j); } //Захватываем диапазон ячеек Excel.Range range1 = sheet.get_Range(sheet.Cells[1, 1], sheet.Cells[9, 9]); //Шрифт для диапазона range1.Cells.Font.Name = "Tahoma"; //Размер шрифта для диапазона range1.Cells.Font.Size = 10; //Захватываем другой диапазон ячеек Excel.Range range2 = sheet.get_Range(sheet.Cells[1, 1], sheet.Cells[9, 2]); range2.Cells.Font.Name = "Times New Roman"; //Задаем цвет этого диапазона. Необходимо подключить System.Drawing range2.Cells.Font.Color = ColorTranslator.ToOle(Color.Green); //Фоновый цвет range2.Interior.Color = ColorTranslator.ToOle(Color.FromArgb(0xFF, 0xFF, 0xCC));
Расстановка рамок.
Расставляем рамки со всех сторон:
range2.Borders.get_Item(Excel.XlBordersIndex.xlEdgeBottom).LineStyle = Excel.XlLineStyle.xlContinuous; range2.Borders.get_Item(Excel.XlBordersIndex.xlEdgeRight).LineStyle = Excel.XlLineStyle.xlContinuous; range2.Borders.get_Item(Excel.XlBordersIndex.xlInsideHorizontal).LineStyle = Excel.XlLineStyle.xlContinuous; range2.Borders.get_Item(Excel.XlBordersIndex.xlInsideVertical).LineStyle = Excel.XlLineStyle.xlContinuous; range2.Borders.get_Item(Excel.XlBordersIndex.xlEdgeTop).LineStyle = Excel.XlLineStyle.xlContinuous;
Цвет рамки можно установить так:
range2.Borders.Color = ColorTranslator.ToOle(Color.Red);
Выравнивания в диапазоне задаются так:
rangeDate.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter; rangeDate.HorizontalAlignment = Excel.XlHAlign.xlHAlignLeft;
Формулы
Определим задачу: получить сумму диапазона ячеек A4:A10.
Для начала снова получим диапазон ячеек:
Excel.Range formulaRange = sheet.get_Range(sheet.Cells[4, 1], sheet.Cells[9, 1]);
Далее получим диапазон вида A4:A10 по адресу ячейки ( [4,1]; [9;1] ) описанному выше:
string adder = formulaRange.get_Address(1, 1, Excel.XlReferenceStyle.xlA1, Type.Missing, Type.Missing);
Теперь в переменной adder у нас хранится строковое значение диапазона ( [4,1]; [9;1] ), то есть A4:A10.
Вычисляем формулу:
//Одна ячейка как диапазон Excel.Range r = sheet.Cells[10, 1] as Excel.Range; //Оформления r.Font.Name = "Times New Roman"; r.Font.Bold = true; r.Font.Color = ColorTranslator.ToOle(Color.Blue); //Задаем формулу суммы r.Formula = String.Format("=СУММ({0}", adder);
Выделение ячейки или диапазона ячеек
Так же можно выделить ячейку или диапазон, как если бы мы выделили их мышкой:
sheet.get_Range("J3", "J8").Activate(); //или sheet.get_Range("J3", "J8").Select(); //Можно вписать одну и ту же ячейку, тогда будет выделена одна ячейка. sheet.get_Range("J3", "J3").Activate(); sheet.get_Range("J3", "J3").Select();
Авто ширина и авто высота
Чтобы настроить авто ширину и высоту для диапазона, используем такие команды:
range.EntireColumn.AutoFit(); range.EntireRow.AutoFit();
Получаем значения из ячеек
Чтобы получить значение из ячейки, используем такой код:
//Получение одной ячейки как ранга Excel.Range forYach = sheet.Cells[ob + 1, 1] as Excel.Range; //Получаем значение из ячейки и преобразуем в строку string yach = forYach.Value2.ToString();
Добавляем лист в рабочую книгу
Чтобы добавить лист и дать ему заголовок, используем следующее:
var sh = workBook.Sheets; Excel.Worksheet sheetPivot = (Excel.Worksheet)sh.Add(Type.Missing, sh[1], Type.Missing, Type.Missing); sheetPivot.Name = "Сводная таблица";
Добавление разрыва страницы
//Ячейка, с которой будет разрыв Excel.Range razr = sheet.Cells[n, m] as Excel.Range; //Добавить горизонтальный разрыв (sheet - текущий лист) sheet.HPageBreaks.Add(razr); //VPageBreaks - Добавить вертикальный разрыв
Сохраняем документ
ex.Application.ActiveWorkbook.SaveAs("doc.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
ex.Workbooks.Open(@"C:UsersMyuserDocumentsExcel.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 с помощью C# большую помощь может оказать редактор Visual Basic, встроенный в Excel.
Для этого в настройках ленты надо добавить пункт «Разработчик». Далее начинаем запись макроса, производим действия и останавливаем запись.
Далее заходим в редактор Visual Basic и смотрим код, который туда записался:
Например:
Sub Макрос1() ' ' Макрос1 Макрос ' ' Range("E88").Select ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$1:$F$118"), , xlYes).Name = _ "Таблица1" Range("A1:F118").Select ActiveSheet.ListObjects("Таблица1").TableStyle = "TableStyleLight9" Range("E18").Select ActiveWindow.SmallScroll Down:=84 End Sub
В данном макросе записаны все действия, которые мы выполнили во время его записи. Эти методы и свойства можно использовать в C# коде.
Данный метод так же может оказать помощь в формировании относительных формул, например, выполнить сложение чисел, находящиеся слева от текущей ячейки на 4 столбца, и т.п. Пример:
//Складываем значения предыдущих 12 ячеек слева rang.Formula = "=СУММ(RC[-12]:RC[-1])";
Так же во время работы может возникнуть ошибка: метод завершен неверно. Это может означать, что не выбран лист, с которым идет работа.
Чтобы выбрать лист, выполните sheetData.Select(Type.Missing);
где sheetData это нужный лист.
Просмотрено:
81 944
This article will demonstrate some basic skills of controlling Excel by using C#, including Create, Open, Save Excel files, Add/Delete
Sheet, Add/Delete/Hide rows and columns, format cells and Export data to Excel. I hope this resource is
useful for some of you.
Import Namespace
using Microsoft.Office.Core; using Microsoft.Office.Interop.Excel; using System.IO; using System.Reflection;
1. How to Open an Excel File, or Create a New Excel File
Application app = new Application(); Workbooks objWBs = app.Workbooks; _Workbook _objWB = objWBs.Add(xxx);
Open an existing Excel file, please replace “xxx” with the excel file path.
Create a new Excel file, please replace “xxx” with “true”.
Note: There is only one worksheet in the Excel file.
2. Get, Delete and Add Sheet
Sheets shs = _objWB.Sheets;
2.1 Get
//i is index of the sheet which you want get: _Worksheet _objWS = (_Worksheet)shs.get_Item(i)
2.2 Delete
//must do when delete app.DisplayAlerts = false; _objWS.Delete();
2.3 Add
a(before),b(after):after which sheet; c:NumberOfSheets to add;d:type (normal, hidden or charttype) app.Worksheets.Add(a,b,c,d);
2.4 Rename Sheet
_objWS.Name = "xxx";
3. Delete Rows and Columns
3.1 Delete Rows
((Range)_objWS.Rows[3, Missing.Value]).Delete(XlDeleteShiftDirection.xlShiftUp);
3.2 Delete Columns
_objWS.get_Range( _objWS.Cells[1, 2], _objWS.Cells[_objWS.Rows.Count, 2]).Delete(XlDeleteShiftDirection.xlShiftToLeft );
4. Add Rows and Columns
4.1 Add Rows
((Range)_objWS.Rows[11, Missing.Value]) .Insert(Missing.Value, XlInsertFormatOrigin.xlFormatFromLeftOrAbove);
4.2 Add Columns
_objWS.get_Range( _objWS.Cells[1, 1], _objWS.Cells[_objWS.Rows.Count, 1]) .Insert(Missing.Value, XlInsertShiftDirection.xlShiftToRight);
5. Format Cells
5.1 Get Cell
//Get cell object _objWS.Cells[row, cell]
5.2 Set Formula
//input formula in the cell _objWS.Cells[row, cell] = "=Sum(A1/B1)";
5.3 Merge Cells
((Range)_objWS.Rows[1, Missing.Value]).Merge(Missing.Value);
5.4 Set Row Height and Column Width
((Range)_objWS.Rows[3, Missing.Value]).RowHeight = 5; ((Range)_objWS.Rows[3, Missing.Value]).ColumnWidth = 5;
5.5 Set Cell Color (56 Choices) Color Table Attached
((Range)_objWS.Rows[1, Missing.Value]).Interior.ColorIndex = 3;
5.6 Set Font Size
((Range)_objWS.Cells[1, "B"]).Font.Size = 8;
5.7 Set Font Bold
((Range)_objWS.Rows[1, Missing.Value]).Font.Bold = false;
5.8 Set Cell or Field Horizontal and Center
((Range)_objWS.Cells[2, 1]).HorizontalAlignment = XlVAlign.xlVAlignCenter;
5.9 Set Field Borders
((Range)_objWS.Cells[3, 3]).Borders.LineStyle = 3;
5.10 Set Border Lines (Upside, Downside, Left Side and Right Side)
//Left side border line _objWS.get_Range( _objWS.Cells[2, 1], _objWS.Cells[2, 2]) .Borders[XlBordersIndex.xlEdgeLeft].Weight = XlBorderWeight.xlThick;// //Right side border line _objWS.get_Range( _objWS.Cells[2, 1], _objWS.Cells[2, 2]) .Borders[XlBordersIndex.xlEdgeRight].Weight = XlBorderWeight.xlThick;// //Upside border line _objWS.get_Range( _objWS.Cells[2, 1], _objWS.Cells[2, 2]) .Borders[XlBordersIndex.xlEdgeTop].Weight = XlBorderWeight.xlThick;//? //Downside border line _objWS.get_Range( _objWS.Cells[2, 1], _objWS.Cells[2, 2]) .Borders[XlBordersIndex.xlEdgeBottom].Weight = XlBorderWeight.xlThick;
6. Copy Selected Field
_Worksheet _objWS = (_Worksheet)shs.get_Item(1);// Copy selected field content Range range = _objWS.get_Range(_objWS.Cells[7, 1], _objWS.Cells[10, _objWS.Columns.Count]); range.Select(); range.Copy(Type.Missing); //Select paste starting position Range test = ((Range)_objWS.Cells[11, 1]); test.Select(); // Shield Alert, default confirm paste app.DisplayAlerts = false; test.Parse(Missing.Value, Missing.Value);
Note: Type Missing and Missing Value are considered as some parameters’ default value. Most of time, they are form complemented parameters.
8. Save Excel and Follow-up Processes
8.1 Save Excel File
// Shield Alert popped up from system app.AlertBeforeOverwriting = false; // Save to selected file path SaveAs(filePath, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
Note: It’s the only solution for saving the Excel file. Otherwise, there will generate a corresponding copy in “My File”.
8.2 Follow-up Processes: Exit and Release
//_objWB.Close(null, null, null); //objWBs.Close(); app.Quit(); // Release unnecessary excel processes System.Runtime.InteropServices.Marshal.ReleaseComObject(app); app = null;
Note: During the process of closing application, we usually have 2 solutions:
- Directly exit app
- Close workbook, close workbooks, exit app. (Recommended)
9. Set Cell Field and Get the Necessary Data from Field
9.1 If cell has been set as drop-down box
// Here the “1, 2, 3” means the drop-down box value ((Range)_objWS.Cells[2, 1]) .Validation.Modify(XlDVType.xlValidateList, XlDVAlertStyle.xlValidAlertStop, Type.Missing, "1,2,3", Type.Missing);
9.2 If cell has not been set as drop-down box
((Range)_objWS.Cells[2, 1]) .Validation.Add(XlDVType.xlValidateList, XlDVAlertStyle.xlValidAlertStop, Type.Missing,"1,2,3", Type.Missing);
9.3 Get drop-down box field value
string strValue = ((Range)_objWS.Cells[2, 1]).Validation.Formula1;
Note: In the excel template, if set drop-down box value through effectiveness, strValue will get the formula of excel, which need be converted.
After get strValue, you can get the numerical value according to index.
10. Hide Rows and Hide Columns
10.1 Hide Rows
_objWS.get_Range(_objWS.Cells[19, 1], _objWS.Cells[22, 1]).EntireRow.Hidden = true;
10.2 Hide Columns
_objWS.get_Range(_objWS.Cells[1, 1], _objWS.Cells[_objWS.Rows.Count, 1]) .EntireColumn.Hidden = true;
11. Convert Excel to PDF (Excel 2007 onwards)
For security reasons, sometimes we need convert Excel to PDF format. However, we can also use C# to do this job. By easily using “Document.ExportAsFixedFormat”
method, we can convert this Excel worksheet to PDF format. Do as the following codes:
objWB.ExportAsFixedFormat(paramExportFormat, pdfPath, paramExportQuality, paramIncludeDocProps, paramIgnorePrintAreas, paramFromPage, paramToPage, paramOpenAfterPublish,mis);
See more:
Dear all,
I am working on windows application. In this application i am working office 2007. i can open .xlsx file using following code.
Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.ApplicationClass(); excelApp.Visible = true; Microsoft.Office.Interop.Excel.Workbook excelWorkbook = excelApp.Workbooks.Open(varFileName,0, false, 5, """, """, false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, """, true, false, 0, true, false, false); Microsoft.Office.Interop.Excel.Worksheet workSheet = (Microsoft.Office.Interop.Excel.Worksheet)excelWorkbook.ActiveSheet; workSheet.Activate();
After that I will do some modification on same xlsx file.
Now problem start with, when I want to save the file.
I am doing this using following code.
excelApp.ActiveWorkbook.Save(); excelApp.ActiveWorkbook.Close((Object)false, (Object)oMissing, (Object)oMissing); excelApp.Quit();
It shows exception as Object reference not set to an instance of an object. It will not show any active document. It shows ActiveWorkbook=null;
Any kind of link, suggestion and specially expert advice would be highly appreciated.
Thanks & Regards,
Balkrishna Raut
- HowTo
- C# Howtos
- Write to an Excel File in C#
Muhammad Maisam Abbas
Jun 08, 2021
Mar 26, 2021
This tutorial will discuss the method to write data to an Excel file in C#.
Write Data to an Excel File With the Microsoft.Office.Interop.Excel
Namespace in C#
The Microsoft.Office.Interop.Excel
namespace provides methods for interacting with the Microsoft Excel application in C#. We can create new Excel sheets, display data of existing sheets, modify the existing Excel sheets’ contents, etc., with this namespace. The following code example shows us how to write our data to an Excel file with the Microsoft.Office.Interop.Excel
namespace in C#. We need to add a reference to the Microsoft.Office.Interop.Excel
namespace from the solution explorer for this approach to work.
using System;
using Excel = Microsoft.Office.Interop.Excel;
namespace write_to_excel
{
class Program
{
static void writeToExcel()
{
Excel.Application myexcelApplication = new Excel.Application();
if (myexcelApplication != null)
{
Excel.Workbook myexcelWorkbook = myexcelApplication.Workbooks.Add();
Excel.Worksheet myexcelWorksheet = (Excel.Worksheet)myexcelWorkbook.Sheets.Add();
myexcelWorksheet.Cells[1, 1] = "Value 1";
myexcelWorksheet.Cells[2, 1] = "Value 2";
myexcelWorksheet.Cells[3, 1] = "Value 3";
myexcelApplication.ActiveWorkbook.SaveAs(@"C:abc.xls", Excel.XlFileFormat.xlWorkbookNormal);
myexcelWorkbook.Close();
myexcelApplication.Quit();
}
}
static void Main(string[] args)
{
writeToExcel();
}
}
}
In the above code, we first initialized an instance of the Excel.Application
class myExcelApplication
. We then initialized the instance myExcelWorkbook
of the Excel.Workbook
class and added a workbook to our myExcelApplication
with the myExcelApplication.Workbooks.Add()
function. After that, we initialized the instance myExcelWorksheet
of the Excel.Worksheet
class and added an excel worksheet to our workbook with the myExcelWorkbook.Sheets.Add()
function.
We then inserted data into the cells inside the myExcelWroksheet
with the myExcelWorksheet.Cells[1, 1] = "Value 1"
. Here, the first index, 1
, is the row index, and the second index, 1
, is the column index. The Excel file was saved by the myExcelApplication.ActiveWorkbook.SaveAs(path, format)
function. In the end, after inserting all the data inside the cells and saving our Excel file, we closed our workbook with myExcelWorkbook.Close()
and exited our application with myExcelApp.Quit()
functions in C#.
Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.
Related Article — Csharp Excel
- Export DataTable to Excel in C#
- Export Data to an Excel File Using C#
- Create Excel File in C#
- Read XLSX File in C#