C excel saveas
Excel interop C++: книга SaveAs исключение-код 0x800A03EC
Я работаю с VBE6EXT и MSO для импорта / экспорта excel файлов из моего приложения C++. Я использую следующий код:
У меня установлен office 2010, активирован, обновлен, и я использую Visual Studio 2015 Community Edition с обновлением 3 на Windows 10.
Когда я пытаюсь открыть файл xlsx и прочитать значение, все работает хорошо, но когда я пытаюсь создать файл с нуля и сохранить его, моя программа аварийно завершает работу и бросает _com_error , со следующим кодом:
Я добавил блок try / catch, и функция printComError(comErr) всегда вызывается со следующей ошибкой:
Ошибка Код = -2146827284 Значение кода = 0975EB58 Источник = Microsoft Excel Описание = компания Microsoft Excel не может accÚder АУ компьютеризованная ½áC:CB7A7C80á╗. Plusieurs raisons sont possibles:
ò Ле ном дю компьютеризованная ОУ Ле-Шемен-д»accÞs nÆexiste па. * Ce fichier est actuellement utilisÚ par un autre programme. * Le classeur que vous essayez dÆenregistrer porte le mÛme nom quÆun classeur actuellement ouvert.
что означает, на английском языке:
Ошибка Код = -2146827284 Значение кода = 0975EB58 Источник = Microsoft Excel Описание = Microsoft Excel не может получить доступ к файлу ½áC:CB7A7C80á╗. Многие причины возможности всегда:
* имя файла или путь к нему не существовали. * этот файл используется другим приложением * лист, который вы хотите сохранить, имеет то же имя, что и другой открытый лист
По-видимому, ошибка -2146827284 похожа на 0x800A03EC, что означает NAME_NOT_FOUND, но его недавно созданный файл и не существовал. Самое странное, что сообщение об ошибке, что имя файла является » ½áC:CB7A7C80á╗», но первый параметр функции SaveAs является «c:\test.xls».
Я видел связанные вопросы в Stackoverflow, но я не нашел полезных ответов.
Эта ошибка связана с кодировкой моей строки? У вас есть какие-то подсказки, чтобы заставить функцию SaveAs работать?
1 Ответ
Это просто проблема прав / разрешений. Если вы используете Excel в качестве конечного пользователя, он отобразит диалоговое окно, в котором будет указано следующее
У вас нет разрешения на сохранение в этом месте. Связаться с администратор для получения разрешения. Вы хотели бы сэкономить в Папка документов вместо этого?
Но, если вы запустите Excel как администратор, он будет работать нормально, или он может работать, потому что, по крайней мере, он работает для меня.
Обратите внимание, однако, что программно он действительно сообщает об ошибке с забавным именем, таким как CB7A7C80 (это временный файл, который он использует за сценой) вместо исходного (повреждение только в начале и конце вашей строки). Я тоже воспроизвожу это забавное имя.
Похожие вопросы:
Я пытаюсь использовать VB.Net Excel COM interop для программного изменения местоположения первого горизонтального разрыва страницы в электронной таблице Excel, создаваемой программой. Код для этого.
Попытка создать файл excel с помощью этого кода: app = new Excel.Application(); app.Visible = false; object misValue = System.Reflection.Missing.Value; workbook = app.Workbooks.Add(misValue);.
Вот справочная информация. У меня есть приложение, которое записывает в файл excel 2007 .xlsm, и я использую для этого библиотеки объектов C# и Excel 12.0 interop, а также Visual Studio 2010. Я могу.
Это исключение, которое я получаю: System.Runtime.InteropServices.COMException (0x800A03EC): исключение от HRESULT: 0x800A03EC в System.RuntimeType.ForwardCallToInvokeMember(String memberName.
У меня возникли проблемы с копированием листов в Excel 2003 с помощью Interop. Код работает для 30-40 копий, а затем возникает исключение Exception from HRESULT: 0x800A03EC. Следующий тестовый код.
Я получил исключение 0x800A03EC, когда я пытался выполнить эту команду в Excel Interop ws.get_Range(A2).Value= =?9ABC Похоже, что interop не любит строку, которая начинается с =?. Я попытался решить.
Я получаю это исключение: System.Runtime.InteropServices.COMException: Exception from HRESULT: 0x800A03EC. на этом кусочке кода: foreach(Excel.Range rng in xlWorkSheet1.UsedRange.Cells) < if.
У меня возникли проблемы с сохранением таблицы excel при запуске на сервере Windows Server 2008 и 2012, но этот проект работает на локальном ПК (Windows 7,8 или 10) C# исходный код.
Работа с Excel с помощью C# (Microsoft.Office.Interop.Excel)
Оставляю заметку по работе с Excel с помощью C#.
Привожу фрагменты кода, которые искал когда-то сам для работы с Excel документами.
Наработки очень пригодились в работе для формирования отчетности.
Прежде всего нужно подключить библиотеку Microsoft.Office.Interop.Excel.
Visual Studio здесь довольно старой версии. Если у вас версия новая, отличаться будет только вид окна.
Далее создаем псевдоним для работы с Excel:
using Excel = Microsoft.Office.Interop.Excel;
Расстановка рамок.
Расставляем рамки со всех сторон:
Цвет рамки можно установить так:
Выравнивания в диапазоне задаются так:
Формулы
Определим задачу: получить сумму диапазона ячеек 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
Комментарии
При работе с Excel с помощью C# большую помощь может оказать редактор Visual Basic, встроенный в Excel.
Для этого в настройках ленты надо добавить пункт «Разработчик». Далее начинаем запись макроса, производим действия и останавливаем запись.
Далее заходим в редактор Visual Basic и смотрим код, который туда записался:
В данном макросе записаны все действия, которые мы выполнили во время его записи. Эти методы и свойства можно использовать в C# коде.
Данный метод так же может оказать помощь в формировании относительных формул, например, выполнить сложение чисел, находящиеся слева от текущей ячейки на 4 столбца, и т.п. Пример:
Так же во время работы может возникнуть ошибка: метод завершен неверно. Это может означать, что не выбран лист, с которым идет работа.
Макрос сохранения листа Excel в файл
Данный макрос позволяет упростить процедуру сохранения активного листа в книге Excel в отдельный файл.
Для использования этого макроса на любом листе в книге Excel создайте кнопку, и назначьте ей макрос СохранитьЛистВФайл.
При запуске макроса (нажатии кнопки) будет выведено диалоговое окно выбора имени для сохраняемого файла, после чего текущий лист будет сохранён под заданным именем в выбранной папке.
Сохранение производится в формате XLS (формат Excel 2003)
Если пользователь отказался от ввода имени файла (нажал клавишу ESC или кнопку «Отмена» в диалоговом окне),
то сохранения листа в файл не происходит.
PS: Кто-то может сказать, что для сохранения листа в файл в объектной модели Excel есть метод SaveAs, применимый к объекту Worksheet.
Но, как ни странно, выполнение кода ActiveSheet.SaveAs » « приводит к сохранению книги целиком, что равносильно использованию кода ActiveWorkbook.SaveAs » «
Почему этот метод сохранения работает так нелогично — лично мне не понятно (видимо, Microsoft что-то там перемудрил)
- 150837 просмотров
Комментарии
Спасибо. Разобрался. Нашёл ошибки в библиотеках.)
Спасибо. Всё запустил, но не работает. Пишет не найден проект или библиотека. Простите, не уточнил, поменял ещё саму систему (был XP стал Win7 x64).
Вот мой код:
Private Sub CommandButton2_Click()
On Error Resume Next
Const REPORTS_FOLDER = «C:Users. . . »
MkDir ThisWorkbook.Path & «» & REPORTS_FOLDER
ChDrive Left(ThisWorkbook.Path, 1): ChDir ThisWorkbook.Path & «» & REPORTS_FOLDER
FileName = [b8] & «_» & [b6] & «_» & [b4] & «_» & Format([b2], «DDMMMMYY») & «_» & [c2] & «.xlsx»
Err.Clear: Worksheets(Array(. «, «. «)).Copy: DoEvents
If Err Then Exit Sub
If ActiveWorkbook.Worksheets.Count = 2 And ActiveWorkbook.Path = «» Then
ActiveWorkbook.SaveAs FileName, xlWorkbookNormal
ActiveWorkbook.Close False
End If
End Sub
Убедитесь, что макросы вообще включены в настройках Excel.
Перед запуском файла с макросами, необходимо выполнить следующее:
> найти файл с макросами в папке
> щелкнуть правой кнопкой мыши на файле — Свойства — Разблокировать — ОК
> и только после этого запускать
Перешёл с 2007 на Office 2016, перестали работать макросы. И этот. (((
Добрый день, подскажите, пожалуйста, что надо изменить в макросе, чтобы:
1. Он копировал не весь лист целеком, а только диапазон ВИДИМЫХ ячеек (A1:L50), т.к. этот диапазон только часть отфильтрованного списка.
2. Он копировал только значения, без формул ячеек.
Здравствуйте, Алексей
Да, можно такое сделать, — могу написать макрос под заказ.
Здравствуйте, Игорь.
Подскажите, пожалуйста, возможно ли такое, чтобы Лист можно было сохранять не единожды (по имени в одной ячейке) а сославшись на какой-либо диапазон ячеек. Есть потребность сделать в конкретной папке количество файлов соответствующее количеству дней в месяце(отчет на каждый день). Если в диапазоне ячеек указать даты месяца и по нажатию макрос сохранял бы, файлы с именем Даты.
Можете написать макрос под заказ? Мне надо до понедельника
Напишите ваши контакты, есть несколько задач.
Дмитрий, можем сделать вам макрос под заказ.
Оформляйте заказ, прикрепляйте файл (в который надо встроить макрос), и подробно описывайте, что куда в каком виде и под каким именем сохранять.
Дело в том, что в книге порядка 20-30 листов и каждый лист необходимо сохранить в отдельные папки, соответствующие имени листа.
Дмитрий, а куда уж проще-то. вы нажимаете одну кнопку «Печать», и получаете готовый файл JPG
Зачем ещё-то упрощать.
Можно, конечно, и макрос под заказ написать
Если в формат BMP (или EMF) картинку сохранять — то макрос несложный, если в формат JPG — то макрос сложнее будет (и дороже)
Но я бы на вашем месте не стал изобретать велосипед, а оставил бы все как есть.
Сохраняю листы в JPEG формате, при помощи виртуального принтера «universal document converter» возможно ли упростить процедуру сохранения активного листа?
Здравствуйте, Игорь. Будьте любезны, взгляните на код. Основная часть была взята с другого сайта, часть с Вашего. Суть такая: на первом листе исходные данные и кнопка, на третьем — расчеты с формулами. Необходимо чтобы при нажатии кнопки создавалась папка «Двери» в текущей папке, где лежит этот файл (а если она есть, то сохранялось в нее), а имя файла бралось с листа 1 из ячеек a17 & b17. Сохраняться должен третий лист (он скрыт), формулы на нем заменить на значения. После сохранения новая книга закрывается и выводится сообщение об удачном сохранении файла с именем из ячеек a17 & b17. Сам я методом тыка пытался воплотить это, но лист не хочет сохраняться с указанным именем (используется имя по умолчанию «Книга 2. Книга 3. ). Также непонятно мне как сделать чтобы выскакивало сообщение о результате сохранения. Подскажите пожалуйста.
On Error Resume Next
Const REPORTS_FOLDER = «Двери»
‘ название подпапки, в которую по-умолчанию будет предложено сохранить файл
MkDir ThisWorkbook.Path & «» & REPORTS_FOLDER
‘ создаём папку для файла, если её ещё нет
ChDrive Left(ThisWorkbook.Path, 1): ChDir ThisWorkbook.Path & «» & REPORTS_FOLDER
‘ выбираем стартовую папку
Filename = Range(«a17») & («b17») & «.xls»
‘ вывод диалогового окна для запроса имени сохраняемого файла
If VarType(Filename) = vbBoolean Then Exit Sub
‘ если пользователь отказался от выбора имени файла — отменяем сохранение листа в файл
Dim Ar(), ArAll&(), Sh As Excel.Worksheet, n
Select Case Sheets(1).[Условие]
Case 1
Ar = Array(3)
Case Else
End Select
ReDim Preserve ArAll(0 To ThisWorkbook.Worksheets.Count — 1)
For Each Sh In ThisWorkbook.Worksheets
ArAll(n) = Sh.Index
n = n + 1
Next
ThisWorkbook.Worksheets(ArAll).Copy
Application.Volatile
Application.Calculate
Application.ScreenUpdating = False
For Each n In Ar
With ActiveWorkbook.Worksheets(n).UsedRange.Cells
.Value = .Value
End With
Next
Erase ArAll: n = 0
ReDim Preserve ArAll(0 To ThisWorkbook.Worksheets.Count — 1 — (UBound(Ar) + 1))
For Each Sh In ActiveWorkbook.Worksheets
If IsError(Application.Match(Sh.Index, Ar, 0)) Then
ArAll(n) = Sh.Index
n = n + 1
Else: If Sh.Visible = False Then Sh.Visible = True
End If
Next
ActiveWorkbook.Sheets(Ar(0)).Activate
Application.DisplayAlerts = False
ActiveWorkbook.Worksheets(ArAll).Delete
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Application.Dialogs(xlDialogSaveAs).Show
ActiveWorkbook.Close False
End Sub
Dim WB As Workbook
Dim ind As Integer
ind = ActiveSheet.Index
Application.DisplayAlerts = False
Set WB = Workbooks.Add
Dim li As Long
Application.DisplayAlerts = False
ind = 3
For n = ind To 2 Step -1
ThisWorkbook.Sheets(n).Copy Before:=WB.Sheets(1)
Next
pdfFilename = Application.DefaultFilePath & Application.PathSeparator & «имя файла» & Range(«D9»).Value & «.pdf»
WB.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=pdfFilename, OpenAfterPublish:=False
При этом файл создается с названием «имя файла.pdf» начисто игнорируя содержимое ячейки указанной.
Вот макрос, который сохраняет без ограничения 255-ти символов в ячейке:
C excel saveas
В MS Office 2007-2010 доступен более расширенный список форматов «xlsx|xlsb|xlsm и т.д.»,
«по умолчанию» используется формат «xlsx»
В базовой UDF «Excel.au3» использование в этой функции таких форматов не предусмотрено,
это можно исправить модифицированием «Excel.au3»;
Инструкции и внедряемый код переведены на этой странице (см.Пример 3)
$oExcel = _ExcelBookNew ( 1 ) ; Создаем новую рабочую книгу Excel
_ExcelBookSaveAs ( $oExcel , @TempDir & «SaveAsExample» , «xls» , 0 , 1 ) ; Сохраняем книгу в директории временных файлов с именем «SaveAsExample.xls», при необходимости перезаписывая, без оповещений
_ExcelBookClose ( $oExcel )
If Not @error Then MsgBox ( 4096 , «_ExcelBookSaveAs | Пример 1» , «Файл успешно сохранен!» , 3 )
_ExcelBookClose ( $oExcel , 1 , 0 ) ; Этот метод при указанных параметрах закрывает рабочую книгу сохраняя изменения без каких либо оповещений Excel
$oExcel = _ExcelBookNew ( 1 ) ; Создаем новую рабочую книгу Excel
_ExcelBookSaveAs ( $oExcel , @TempDir & «SaveAsExample» , «xls» , 0 , 1 , «Password» ) ; Сохраняем книгу в директории временных файлов с именем «SaveAsExample.xls», при необходимости перезаписывая, без оповещений, защищая паролем «Password»
_ExcelBookClose ( $oExcel )
If Not @error Then MsgBox ( 4096 , «_ExcelBookSaveAs | Пример 2» , «Файл успешно сохранен!» )
_ExcelBookClose ( $oExcel , 1 , 0 ) ; Этот метод при указанных параметрах закрывает рабочую книгу сохраняя изменения без каких либо оповещений Excel
If Not @error Then MsgBox ( 4096 , «_ExcelBookSaveAs | Пример 2» , «Попытаемся открыть сохраненную книгу для того чтобы проверить созданный пароль» )
$oExcel = _ExcelBookOpen ( @tempdir & «saveasexample.xls» , 1 , False ) ; Открывает сохраненную книгу для проверки защиты паролем
;*************************************************************************************************
;Пример 3 — Модификация Excel.au3, для использования в методе _ExcelBookSaveAs форматов MS Office Excel 2007-2010
;*************************************************************************************************
;В данном коде описываются лишь некоторые из форматов доступных для сохранения рабочей книги в MS Office Excel 2007-2010
;Все остальные форматы вы можете описать по аналогии, для этого посетите MSDN в разделе Visual Basic for Applications
;найдите описания констант форматов и их числовые эквиваленты ( «http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.xlfileformat.aspx» )
;после чего добавьте константы с соответствующими числовыми значениями в Excel.au3, и используйте их в этом коде по аналогии
;Откройте Excel.au3, к описанию констант добавьте
Global Const $xlExcel12 = 50 ; расширение xlsb (Excel Binary Workbook in 2007-2010 with or without macro’s)
Global Const $xlOpenXMLWorkbook = 51 ; расширение xlsx (xlOpenXMLWorkbook without macro’s in 2007-2010)
Global Const $xlOpenXMLWorkbookMacroEnabled = 52 ; расширение xlsm (xlOpenXMLWorkbookMacroEnabled with or without macro’s in 2007-2010)
Global Const $xlExcel8 = 56 ;расширение xls (xlExcel8 97-2003 format in Excel 2007-2010)
;перейдите на строку № 339 и замените блок IF — Else — EndIf следующим кодом
If $sType = «xls» Or $sType = «csv» Or $sType = «txt» Or $sType = «template» Or $sType = «html» Or $sType = «xlsb» Or $sType = «xlsx» Or $sType = «xlsm» then
If $sType = «xls» Then $sType = $xlExcel8
If $sType = «csv» Then $sType = $xlCSVMSDOS
If $sType = «txt» Then $sType = $xlTextWindows
If $sType = «template» Then $sType = $xlTemplate
If $sType = «html» Then $sType = $xlHtml
If $sType = «xlsx» Then $sType = $xlOpenXMLWorkbook
If $sType = «xlsm» Then $sType = $xlOpenXMLWorkbookMacroEnabled
If $sType = «xlsb» Then $sType = $xlExcel12
Else
Return SetError ( 2 , 0 , 0 )
EndIf
Как на VBA сохранить файл Excel с названием, взятым из ячейки?
Привет, сейчас мы рассмотрим ситуацию, когда у Вас возникла необходимость в Excel сохранять файл с определенным названием, которое необходимо сформировать из значения ячейки или даже нескольких. В этой заметке я приведу простой пример реализации данной задачи.
Исходные данные
Сначала давайте разберем исходные данные, которые я буду использовать в примерах. Пусть это будет некая абстракция марок автомобилей с указанием их VIN номера.
Примечание! Я использую Excel 2013.
В зависимости от конкретных требований и условий, задачу можно реализовать по-разному, хотя принцип будет один и тот же, в этой статье мы рассмотрим несколько вариаций реализации.
Начнем мы с самой простой ситуации, когда заранее известна ячейка, на основе которой будет сформировано имя файла, и адрес этой ячейки изменяться не будет.
Сохранение файла Excel с названием из ячейки — с привязкой к этой ячейке
Итак, данные у нас есть, теперь необходимо написать процедуру на VBA (макрос), которая брала бы значение из конкретной ячейки, в данном случае это будет ячейка B14, и присваивала бы это значение имени файла.
Ниже представлен код процедуры, я его подробно прокомментировал. Единственное скажу, что я во всех примерах сохраняю новые файлы без макросов (расширение .xlsx), т.е. по факту будет один файл с поддержкой макросов, а все производные — без.
Если нужно сохранять макрос в каждом файле, т.е. файлы с поддержкой макросов (расширение .xlsm), то необходимо просто указать другой тип файла при сохранении, а именно xlOpenXMLWorkbookMacroEnabled, в процедурах в комментариях я это указываю.
Открываем в Excel редактор Visual Basic, и вставляем код следующей процедуры в исходный код этой книги (ЭтаКнига, открыть двойным кликом) или в модуль, который Вы предварительно должны создать.
Примечание! Для того чтобы открыть редактор Visual Basic в Excel, необходимо перейти на вкладку «Разработчик» и нажать на кнопку «Visual Basic». Файл Excel с кодом процедуры необходимо сохранить с типом «Книга Excel с поддержкой макросов».
Код процедуры
После сохранения файла запустите макрос («Макросы -> Выполнить -> SaveFile»).
В результате в моем случае процедура успешно выполнилась, файл сохранился с названием «Марка Авто 1», данное значение взято из ячейки B14, о чем будет свидетельствовать сообщение в конце процедуры. Файл сохранен в каталоге, где и исходный файл (во всех примерах ниже прописано то же самое, т.е. сохранение рядом с исходником, но это Вы можете изменить).
Добавление кнопки в Excel для запуска макроса
Каждый раз открывать окно с макросами и выбирать нужный макрос не очень удобно, поэтому можно легко добавить кнопку где-нибудь рядом с данными и просто нажимать ее. Это делается следующим образом «Вкладка Разработчик -> Вставить -> Кнопка (элемент управления формы)».
Затем выберите место, где вставить кнопку, и нажмите туда. После этого появится окно назначения действия, т.е. нужно выбрать, какой макрос запускать при нажатии этой кнопки, выбираем наш макрос, т.е. SaveFile, и нажимаем «ОК».
В итоге появится кнопка с названием «Кнопка», это название лучше изменить, например, на «Сохранить файл». Для этого нажмите правой кнопкой мыши на кнопку и выберите настройки «Изменить текст». В итоге у Вас должно получиться что-то вроде этого.
Сохранение файла Excel с названием из ячейки — без привязки к ячейке
Теперь давайте представим, что заранее мы не можем определить, какая именно ячейка будет формировать название файла (может B14, а может и нет), поэтому мы можем немного скорректировать алгоритм таким образом, чтобы он брал значение из ячейки, которая является активной, но в этом случае Вы, конечно же, предварительно, должны выбрать ее (т.е. встать на нее).
Замените код процедуры следующим кодом, который совсем немного, но изменен.
Проверяем работу, становимся на нужную ячейку, и запускаем макрос (в процедуре я добавил проверку, если выбрана пустая ячейка, возникнет ошибка).
Как видим, все отработало.
Сохранение файла Excel с названием, которое сформировано из значений двух ячеек
Теперь представим, что нам нужно сформировать файл с названием из значений двух ячеек. Например, в нашем случае это может быть «Марка Авто – VIN Номер», в качестве разделителя я указал символ – (дефис), но им может выступать любой символ или вовсе отсутствовать.
В этом примере я покажу, как можно это реализовать с привязкой к конкретным ячейкам, в нашем случае B14 и D14.
Код процедуры в данном случае будет выглядеть следующим образом.
Все ОК, файл создан.
Если вдруг нужно реализовать без привязки к конкретным ячейкам, например, значения хранятся в определённых столбцах, но конкретная строка неизвестна Вам заранее. Например, у меня несколько строк со значениями, и какие конкретно значения взять за основу названия файла, я хочу указывать самостоятельно, непосредственно перед сохранением, но при этом не редактировать код процедуры.
Для этого мы снова внесем изменения в нашу процедуру, которая будет работать от активной ячейки (смещение от активной ячейки), только с условием того, что выбран столбец с теми значениями, которые необходимо использовать.
Код процедуры
Становитесь на любую ячейку со значением в столбце B, и запускайте макрос.
У меня на этом все, надеюсь, материал был Вам полезен, пока!