C сохранить в Excel
Обновлено: 20.11.2024
Версию этой статьи для Microsoft Visual Basic 6.0 см. в разделе 247412.
Обзор
Наиболее часто для переноса данных в книгу Excel используется автоматизация. С помощью автоматизации вы можете вызывать методы и свойства, характерные для задач Excel. Автоматизация обеспечивает наибольшую гибкость при указании местоположения ваших данных в книге, форматировании книги и выполнении различных настроек во время выполнения.
С помощью автоматизации вы можете использовать несколько методов для передачи данных:
- Перенос данных ячейка за ячейкой.
- Перенос данных из массива в диапазон ячеек.
- Перенос данных из набора записей ADO в диапазон ячеек с помощью метода CopyFromRecordset.
- Создайте объект QueryTable на листе Excel, содержащий результат запроса к источнику данных ODBC или OLEDB.
- Перенесите данные в буфер обмена, а затем вставьте содержимое буфера обмена на лист Excel.
Вы также можете использовать несколько методов, которые не обязательно требуют автоматизации для передачи данных в Excel. Если вы используете программу на стороне сервера, это может быть хорошим подходом, позволяющим снять основную часть обработки данных с ваших клиентов.
Для переноса данных без автоматизации можно использовать следующие подходы:
Методы
Использование автоматизации для передачи данных по ячейкам
С помощью автоматизации вы можете передавать данные на лист по одной ячейке за раз:
Перенос данных ячейка за ячейкой является приемлемым подходом, если у вас небольшое количество данных. У вас есть возможность размещать данные в любом месте книги, и вы можете условно форматировать ячейки во время выполнения. Однако не рекомендуется использовать этот подход, если у вас есть большой объем данных для переноса в книгу Excel. Каждый объект Range, который вы получаете во время выполнения, приводит к запросу интерфейса, что означает более медленную передачу данных. Кроме того, Microsoft Windows 95, Microsoft Windows 98 и Microsoft Windows Millennium Edition (Me) имеют ограничение в 64 килобайта (КБ) для запросов интерфейса. Если у вас более 64 КБ запросов интерфейса, сервер автоматизации (Excel) может перестать отвечать или вы можете получать сообщения об ошибках, указывающие на нехватку памяти.
Опять же, передача данных ячейка за ячейкой приемлема только для небольших объемов данных. Если вам необходимо перенести большие наборы данных в Excel, рассмотрите возможность использования одного из других подходов, обсуждаемых в этой статье, для массовой передачи данных.
Использование автоматизации для переноса массива данных в диапазон на листе
Вы можете передать массив данных в диапазон нескольких ячеек одновременно:
Если вы передаете данные, используя массив, а не ячейку за ячейкой, вы можете добиться огромного прироста производительности при большом количестве данных. Рассмотрим следующие строки из вышеупомянутого кода, которые передают данные в 300 ячеек на листе:
Этот код представляет два запроса интерфейса: один для объекта Range, который возвращает метод Range, и другой для объекта Range, который возвращает метод Resize. Напротив, для передачи данных ячейка за ячейкой требуются запросы на 300 интерфейсов к объектам Range. Когда это возможно, вы можете извлечь выгоду из массовой передачи данных и сокращения количества запросов к интерфейсу, которые вы делаете.
Для получения дополнительных сведений об использовании массивов для получения и установки значений в диапазонах с помощью автоматизации Excel щелкните номер статьи ниже, чтобы просмотреть статью в базе знаний Майкрософт:
Использование автоматизации для переноса набора записей ADO в диапазон рабочих листов
Объектные модели для Excel 2000, Excel 2002 и Excel 2003 предоставляют метод CopyFromRecordset для переноса набора записей ADO в диапазон на листе. В следующем коде показано, как автоматизировать Excel для передачи содержимого таблицы Orders в образце базы данных Northwind с помощью метода CopyFromRecordset:
Использование автоматизации для создания объекта QueryTable на листе
Объект QueryTable представляет собой таблицу, построенную на основе данных, возвращенных из внешнего источника данных. При автоматизации Excel можно создать QueryTable, предоставив строку подключения к источнику данных OLE DB или ODBC и строку SQL. Excel создает набор записей и вставляет его на лист в указанное вами место. Объекты QueryTable обладают следующими преимуществами по сравнению с методом CopyFromRecordset:
- Excel обрабатывает создание набора записей и его размещение на листе.
- Вы можете сохранить запрос с объектом QueryTable и обновить его позже, чтобы получить обновленный набор записей.
- Когда на лист добавляется новая таблица QueryTable, вы можете указать, что данные, которые уже существуют в ячейках на листе, должны быть сдвинуты для обработки новых данных (дополнительную информацию см. в описании свойства RefreshStyle).
В следующем коде показано, как в Excel 2000, Excel 2002 или Excel 2003 автоматизировать создание новой таблицы QueryTable на листе Excel с использованием данных из примера базы данных "Борей":
Использование буфера обмена Windows
Создайте текстовый файл с разделителями, который Excel может разбивать на строки и столбцы
Excel может открывать файлы с разделителями табуляцией или запятыми и правильно анализировать данные в ячейках. Вы можете использовать эту функцию, когда хотите перенести большое количество данных на рабочий лист, практически не используя автоматизацию. Это может быть хорошим подходом для клиент-серверной программы, поскольку текстовый файл может быть сгенерирован на стороне сервера. Затем вы можете открыть текстовый файл на клиенте, используя автоматизацию там, где это уместно.
Вышеупомянутый код не использует автоматизацию. Однако при желании вы можете использовать автоматизацию, чтобы открыть текстовый файл и сохранить его в формате рабочей книги Excel, как показано ниже:
Вы можете использовать поставщик Microsoft Jet OLE DB для добавления записей в таблицу в существующей книге Excel. Таблица в Excel — это просто диапазон ячеек; диапазон может иметь определенное имя. Как правило, первая строка диапазона содержит заголовки (или имена полей), а все последующие строки диапазона содержат записи.
Следующий код добавляет две новые записи в таблицу в Book7.xls. Таблица в данном случае — Sheet1:
Чтобы получить дополнительную информацию об использовании поставщика Jet OLEDB с источниками данных Excel, нажмите на номера статей ниже, чтобы просмотреть статьи в базе знаний Майкрософт:
278973 SAMPLE: ExcelADO демонстрирует, как использовать ADO для чтения и записи данных в книгах Excel
257819 HOWTO: использование ADO с данными Excel из Visual Basic или VBA
Перенос XML-данных (Excel 2002 и Excel 2003)
Excel 2002 и 2003 могут открывать любые правильно сформированные XML-файлы. Вы можете открывать XML-файлы напрямую, используя команду «Открыть» в меню «Файл», или программно, используя методы Open или OpenXML коллекции Workbooks. Если вы создаете XML-файлы для использования в Excel, вы также можете создавать таблицы стилей для форматирования данных.
Создайте новую папку с именем C:\ExcelData. Образец программы будет хранить книги Excel в этой папке.
Создайте новую книгу для записи образца:
- Создайте новую книгу в Excel.
- На Листе 1 новой книги введите Имя в ячейке A1 и Фамилию в ячейке B1.
- Выберите A1:B1.
- В меню «Вставка» выберите «Имя» и нажмите «Определить». Введите имя MyTable и нажмите OK.
- Сохраните книгу как C:\Exceldata\Book7.xls.
- Выйти из Excel.
Добавьте ссылку на библиотеку объектов Excel и основную сборку взаимодействия ADODB. Для этого выполните следующие действия:
- В меню "Проект" нажмите "Добавить ссылку".
- На вкладке "Сеть" найдите ADODB и нажмите "Выбрать".
Примечание. В Visual Studio 2005 нажимать кнопку "Выбрать" не нужно.
3. На вкладке COM найдите библиотеку объектов Microsoft Excel 10.0 или библиотеку объектов Microsoft Excel 11.0 и нажмите кнопку "Выбрать".
Примечание. В Visual Studio 2005 нажимать кнопку "Выбрать" не нужно.
Примечание. Если вы используете Microsoft Excel 2002, но еще не сделали этого, Microsoft рекомендует загрузить, а затем установить основные сборки взаимодействия (PIA) Microsoft Office XP.
В диалоговом окне "Добавить ссылки" нажмите "ОК", чтобы подтвердить выбор.
Добавьте элемент управления "Поле со списком" и элемент управления "Кнопка" в форму Form1.
Добавьте обработчики событий для события загрузки формы и событий Click элемента управления Button:
- В режиме конструктора для Form1.cs дважды щелкните Form1.
Обработчик события Load формы создается и отображается в Form1.cs.
2. В меню Вид щелкните Конструктор, чтобы переключиться в режим конструктора.
3. Дважды щелкните Button1.
Обработчик события Click кнопки создается и отображается в Form1.cs.
В Form1.cs замените следующий код:
Вы можете использовать Microsoft Excel 2013 XLL Software Development Kit и C API для создания высокопроизводительных функций листа для Excel 2013. Обновления до Excel 2013 C API отражают постоянную поддержку пользователей, для которых производительность сторонних или внутренняя функциональность имеет решающее значение.
Интерфейсы программирования Excel
Excel предоставляет несколько возможностей для разработки взаимодействующих с ним приложений. Программные интерфейсы Excel добавлялись в более ранние версии в следующем порядке:
Макроязык XLM: первый доступный пользователю язык для расширения Excel и основа C API. Хотя XLM по-прежнему поддерживается в Excel 2010, он уже давно заменен Visual Basic для приложений (VBA).
C API и XLL: библиотеки DLL, интегрированные с Excel. Эти библиотеки DLL обеспечивают наиболее прямой и быстрый интерфейс для добавления высокопроизводительных функций работы с таблицами, хотя и за счет некоторой сложности по сравнению с более поздними технологиями.
VBA: объекты кода Visual Basic, связанные с объектами книги Excel. VBA позволяет перехватывать события, настраивать их и добавлять определяемые пользователем функции и команды. VBA является наиболее часто используемым и наиболее доступным из вариантов расширения.
COM: стандарт взаимодействия для приложений Windows, с помощью которого Excel предоставляет доступ к своим событиям и объектам. VBA использует COM для взаимодействия с Excel. Excel экспортирует библиотеки типов COM, которые могут помочь вам создавать ресурсы кода C++ COM и приложения, которые могут управлять Excel извне.
Когда использовать C API
Основной причиной написания XLL и использования C API является создание высокопроизводительных функций рабочего листа. Хотя функции XLL часто называют определяемыми пользователем функциями, затраты времени на получение понимания и навыков, необходимых для написания XLL, делают эту технологию непрактичной для большинства пользователей. Тем не менее применение высокопроизводительных функций — а в Excel 2013 и возможность писать многопоточные интерфейсы для мощных ресурсов сервера — делают это очень важной частью расширяемости Excel.
Пересмотр C API, представленный в Excel 2007, в основном касается аспектов, связанных с высокопроизводительными вычислениями, а не такими функциями, как пользовательский интерфейс.
Написание высокопроизводительных пользовательских функций рабочего листа
Excel C API — идеальный выбор, если вы хотите создавать высокопроизводительные функции рабочего листа, создавая надстройки XLL. C API предоставляет вам самый прямой доступ к данным рабочего листа. XLL предоставляют Excel самый прямой доступ к ресурсам DLL. В Excel 2013 производительность XLL дополнительно повышена за счет добавления новых типов данных и, что наиболее важно, поддержки выполнения определяемых пользователем функций на кластеризованных серверах.
Доступ к многопоточным серверам с помощью функций рабочего листа XLL
Многопоточный пересчет (MTR), впервые представленный в Excel 2007, позволяет создавать потокобезопасные функции листа XLL. Вы можете использовать эти функции для доступа к многопоточным серверам. В следующих разделах более подробно описывается, как это может значительно повысить производительность, наблюдаемую пользователем. Для пользователей Excel, которым иногда требуется доступ к большой вычислительной мощности, сочетание XLL, использующего MTR, и мощного сервера вычислений обеспечивает высочайшую производительность.
Настройка пользовательского интерфейса Excel
Для многих версий Excel API C был не лучшим выбором для настройки пользовательского интерфейса. VBA имеет превосходный доступ к объектам и событиям Excel. Пользовательский интерфейс, представленный в Excel 2007, значительно отличается от более ранних версий как по внешнему виду, так и по базовой технологии. Этот интерфейс лучше всего настроить с помощью ресурсов управляемого кода.
Создание приложений, доступных в Интернете
Управление Excel из внешних приложений
Асинхронный вызов Excel
Excel позволяет XLL вызывать C API только в том случае, если Excel передал управление XLL. Функция рабочего листа, вызываемая Excel, может выполнять обратный вызов в Excel с помощью C API. Команда XLL, вызываемая Excel, может вызывать C API. Функции и команды DLL и XLL, которые вызываются VBA, когда сам VBA вызывается Excel, могут вызывать C API. Вы не можете, например, установить синхронизированный обратный вызов Windows в свой XLL и вызвать из него C API, и вы не можете вызвать C API из фонового потока, созданного вашим XLL. Асинхронный вызов Excel с помощью COM из библиотеки DLL или XLL не рекомендуется.
Это очень ограничивает, поскольку могут быть приложения, в которых вы хотите, чтобы Excel асинхронно реагировал на событие. Например, вы можете захотеть, чтобы Excel извлек часть данных из Интернета и пересчитывал их при каждом изменении этих данных. Или вы можете захотеть, чтобы фоновый поток выполнял вычисления и чтобы Excel пересчитывал их после завершения.
Этого можно добиться, заставив Excel активно запрашивать изменения, но это неэффективно и имеет ограничения, поскольку Excel часто прерывает свою обычную работу. Вы можете настроить повторяющуюся синхронизированную команду с помощью C API или VBA, хотя это не идеальное решение.
В идеале вы хотели бы, чтобы более эффективный внешний процесс проверял изменение данных и чтобы этот внешний процесс запускал Excel для получения обновления и выполнения пересчета. Это можно сделать с помощью приложения, которое взаимодействует с Excel с помощью COM. COM не ограничен, как C API, выполнением вызовов только тогда, когда Excel явно передал ему управление. Приложения COM могут вызывать методы Excel всякий раз, когда Excel находится в состоянии готовности, хотя вызовы этих методов могут игнорироваться, если отображаются диалоговые окна, раскрываются меню или выполняется макрос.
C API и его связь с XLM
Язык макросов Excel (XLM) был первой доступной пользователю средой программирования, реализованной в Excel. Это позволило пользователям создавать собственные команды и функции на специальных листах макросов, которые выглядят как обычные рабочие листы. Листы макросов XLM по-прежнему поддерживаются в Excel 2013. Вы можете использовать все обычные функции рабочего листа, такие как SUM и LOG, на листе макроса, в дополнение к следующим элементам, которые нельзя ввести на листе:
Информационные функции рабочей области, такие как GET.CELL и GET.WORKBOOK.
Функции, эквивалентные командам, которые позволяют автоматизировать обычные пользовательские операции, такие как DEFINE.NAME и PASTE.
Функции, относящиеся к надстройкам, например REGISTER.
Ловушки событий, эквивалентные командам, такие как ON.ENRTY и ON.TIME.
Операции макрофункций, такие как ARGUMENT и VOLATILE.
Операции управления потоком, такие как GOTO и RETURN.
Ограниченная версия C API существовала в Excel версии 3. Однако в Excel версии 4 язык XLM был сопоставлен с C API. С тех пор библиотеки DLL могут вызывать все функции рабочего листа, информационные функции листа макросов и команды, а также устанавливать ловушки событий. Библиотеки DLL не могут вызывать функции управления потоком XLM из C API. Эти функции и команды листа макросов задокументированы в файле справки XLMacr8.hlp (ранее называвшемся Macrofun.hlp). Чтобы получить этот файл справки, перейдите в Центр загрузки Майкрософт и выполните поиск «XLMacr8.hlp».
Windows Vista и Windows 7 не поддерживают файлы .hlp напрямую, но вы можете загрузить программу справки Windows (WinHlp32.exe) для Windows Vista или программу справки Windows (WinHlp32.exe) для Windows 7, которая позволяет их использовать. открыть.
DLL вызывают эквиваленты C API этих функций и команд с помощью функций обратного вызова Excel4, Excel4v, Excel12 и Excel12v (последние две были введены в Excel 2007). Перечисленные константы, соответствующие каждой функции и команде, определяются в заголовочном файле и передаются в качестве одного из аргументов этих обратных вызовов. Например, GET.CELL представлен xlfGetCell, REGISTER — xlfRegister, а DEFINE.NAME — xlcDefineName.
Помимо функций рабочего листа, а также функций и команд макролиста, C API предоставляет перечисления функций и команд, которые можно вызывать только с помощью этих обратных вызовов из библиотеки DLL. Например, xlGetName позволяет библиотеке DLL самостоятельно определять полный путь и имя файла, что требуется при регистрации функций и команд в Excel.
С момента появления листов Visual Basic для приложений (VBA) в Excel версии 5 и редактора Visual Basic (VBE) в версии 8 (Excel 97) пользователям проще всего настроить Excel с помощью VBA вместо XLM. Следовательно, большая часть новых функций, представленных в более поздних версиях Excel, доступна через VBA, но не через XLM или C API. Например, некоторые команды, ловушки событий и расширенные возможности диалоговых окон доступны через VBA, но не через XLM или C API.
Мне нужно создать файл Excel с помощью программы на C, а затем заполнить
его. Как это можно сделать?
Узнайте у Microsoft формат файла, а затем напишите код для создания файла.
Узнав о формате файлов Excel (если M$ позволит вам), это
не по теме здесь. Как только вы это сделаете, и у вас будет код C, который доставляет вам
проблемы, не стесняйтесь возвращаться сюда за помощью.
На самом базовом уровне вам понадобятся `fopen()`, `fwrite()` и друзья
от .
--
Под каждым камнем прячется политик.
-- Аристофан
fopen() файл с режимом "wb" (бинарная запись),
затем fwrite() или fprintf() или putc() или fputc(), что вам нужно.
Возможно, вам следует избегать использования функций putw() и fputs():
putw() работает с типом "int", который
неодинаков по размеру во всех системах; а fputs() включает завершающий символ новой строки,
который не является одним и тем же символом (символами) во всех системах.
Теперь вам нужно знать, какова структура файла Excel.
Это тема, выходящая за рамки стандарта C, и
может быть изменена Microsoft без предварительного уведомления ("Документирование
структуры файлов вредит нашей способности к инновациям!!") Inc. р>
В этом случае лучше использовать Visual Basic! Гораздо проще и удобнее.
В этом случае лучше использовать Visual Basic! Гораздо проще и
удобнее.
Другая возможность: используйте формат CSV (значения, разделенные запятыми).
--
Остерегайтесь смоляной ямы Тьюринга, в которой все возможно, но
ничто из интересного не дается легко.
Возможно, создайте файл .csv (что можно сделать с помощью обычного fprintf и
обработки строк в C) и импортируйте его с помощью Excel.
В противном случае, возможно, существует библиотека или какой-либо способ использования Excel в качестве
совместного процесса, вам придется узнать об архитектуре Office и Microsoft
.
В этом случае лучше использовать Visual Basic! Гораздо проще и удобнее.
Ты подонок. VB - это не язык. «Языки» работают более чем в одной
среде.
Мой друг сделал однооконное приложение с двумя подсказками и больше ничего, и
оно занимало 3 мегабайта оперативной памяти. Я сделал то же самое на C (с ругательствами), и
это использовало около 50 КБ, что мне тогда казалось много.
--
"Каждое простое число в серии как шутка
Я прояснил все закономерности, когда сделал последнюю затяжку"
- - Эндрю Поелстра
if (NULL == (excelfile = fopen("filename", "w")))
exit(EXIT_FAILURE);
иначе пока (подходящие условия) fwrite(excelfile, data);
>
fclose(excelfile);
Вы должны сами
определить имя файла, подходящие условия и данные.
--
"Если вы хотите опубликовать продолжение через groups.google.com, не используйте
неработающую ссылку "Ответить" внизу статьи. Нажмите
>"показать параметры" в верхней части статьи, затем нажмите
"Ответить" в нижней части заголовков статьи." - Кит Томпсон
Подробнее:
Также см.
jeniffer написал: Мне нужно создать файл excel с помощью программы C, а затем
заполнить его. Как это можно сделать?
ФАЙЛ *excelfile; if (NULL == (excelfile = fopen("filename", "w")))
exit(EXIT_FAILURE);
Файлы Excel являются двоичными и чаще всего используются на платформах,
где различие между двоичными и текстовыми файлами имеет смысл.
Поэтому ОП рекомендуется использовать «wb» вместо «w».
--
Если вы солжете компилятору, он отомстит. -- Генри Спенсер
В этом случае лучше использовать Visual Basic! Гораздо проще и удобнее.
Ты подонок. VB - это не язык. "Языки" работают более чем в одной
среде.
Ну, требования включают в себя приложение, которое в основном
доступно только на одной платформе. В этом случае VB (или одна из встроенных
VB-подобных штуковин в Office) будет достойным выбором.
Если ваш дизайн преднамеренно ограничивает вас одной платформой, то
мало смысла пытаться быть переносимым, особенно для версии 1.
В моем магазине есть другая проблема; пытаясь сделать достаточно портативные
расширения, которые также могут общаться с безумием, которым является Office.
Хорошо, быстро или дешево. Выберите любые два.
Мне нужно создать файл excel с помощью программы на C, а затем
заполнить его. Как это можно сделать?
Это не совсем по теме здесь, но.
В 100% стандартном C вы можете сделать это
В 100% стандартном C вы можете сделать это с помощью
"it" означает "создать файл excel и заполнить его".
Это не создает файл Excel: в лучшем случае создается файл, который Excel
может прочитать.
Возврат -1 из main() будет иметь эффект, определяемый реализацией.
Поскольку вы уже включили , почему бы не использовать EXIT_FAILURE
вместо этого?
Вызов system() не имеет отношения к исходной проблеме создания
и заполнения файла Excel и делает программу гораздо менее переносимой.
Существует еще одна проблема с кодом, которая может возникнуть особенно
в Германии: запятая может быть десятичным разделителем (эквивалентным
десятичной точке), а ожидаемый разделитель полей может быть
> точка с запятой. Число 1,2 в файле можно интерпретировать как 1 + 2/10
(1.2), а не как указание границы между двумя ячейками.
--
Если вы солжете компилятору, он отомстит. -- Генри Спенсер
jeniffer написал: Мне нужно создать файл excel с помощью программы C, а затем заполнить
его. Как это можно сделать?
Это не совсем по теме здесь, но.
В 100% стандартном C вы можете сделать это с помощью
Это 100 % стандарт и 0 % портативность, и он не удовлетворяет
исходным требованиям.
Помимо других непереносимых устройств, которые уже были
упомянуты, у меня есть MS Excel на моем компьютере, но его нет на моем
приводе DVD (D:).
Если ваша программа изначально непереносима, мало смысла
избегать использования нестандартных расширений, которые будут выполнять работу
лучше, чем system(). Конечно, использование таких расширений
сделало бы программу неактуальной в этой группе новостей -- что всего лишь означает,
что ее следует обсудить в *другой* группе новостей, возможно, в одной
полной группе новостей. экспертов, которые могут знать лучшие способы создания файлов Excel.
Конечно, если бы вы использовали системный вызов, предусмотренный стандартом, вам
не понадобились бы нестандартные заголовки, и он
скомпилировался бы и работал со многими другими компиляторами. Например,
реализация gcc, являющаяся частью Cygwin.
Я так и сделал, см. мой другой пост
jacob navia пишет:
В 100% стандартном C вы можете сделать это с помощью
Это 100 % стандарт и 0 % портативность, и он не удовлетворяет
исходным требованиям.
Помимо других непереносимых устройств, которые уже были
упомянуты, у меня есть MS Excel на моем компьютере, но его нет на моем
приводе DVD (D:).
Если ваша программа изначально непереносима, мало смысла
избегать использования нестандартных расширений, которые будут выполнять работу
лучше, чем system(). Конечно, использование таких расширений
сделало бы программу неактуальной в этой группе новостей -- что всего лишь означает,
что ее следует обсудить в *другой* группе новостей, возможно, в одной
полной группе новостей. экспертов, которые могут знать лучшие способы создания файлов Excel.
ShellExecute позволяет игнорировать путь
исполняемого файла excel. system() не так умна, и в этом случае путь
зашит. Таким образом, программа не является переносимой, но ее можно заставить работать на
любой машине с Excel без особых усилий :-)
Конечно, lcc-win32 предлагает возможность использования диспетчерского
интерфейса Excel и динамического заполнения ячеек, заставляя Excel
отображать графические данные, что угодно. Но если бы я опубликовал это
, это была бы программа на 1500 строк, полная оконного кода. содрогаюсь.
Остановимся на этом. Если исходное сообщение интересно, мы можем
обсудить это в группе lcc.
В статье
jacob navia написал, не цитируя
исходный текст:
В 100% стандартном C вы можете сделать это
Это не создает файл Excel: в лучшем случае создается файл, который Excel
может прочитать.
Ну, "файл Excel" - это файл, который Excel может прочитать, я полагаю :-)
Возврат -1 из main() будет иметь эффект, определяемый реализацией.
Поскольку вы уже включили , почему бы не использовать EXIT_FAILURE
вместо этого?
Это правда. Так будет лучше.
Вызов system() не имеет отношения к исходной проблеме создания
и заполнения файла Excel и делает программу гораздо менее переносимой.
Существует еще одна проблема с кодом, которая может возникнуть особенно
в Германии: запятая может быть десятичным разделителем (эквивалентным
десятичной точке), а ожидаемый разделитель полей может быть
> точка с запятой. Число 1,2 в файле может быть интерпретировано как 1 + 2/10
(1.2), а не как указание границы между двумя ячейками.
Это можно исправить с помощью LC_LOCALE и посмотреть, что делает немецкая версия
excel.
[snip] Конечно, lcc-win32 предлагает возможность использования диспетчерского
интерфейса Excel и динамического заполнения ячеек, заставляя Excel
отображать графику данных, что угодно. Но если бы я опубликовал
это, это была бы программа на 1500 строк, полная оконного
кода. содрогаться.
Это также, вероятно, было бы ближе к тому, что на самом деле
искала OP (не в том месте).
Попытка создать корректный файл ".xls" с использованием только стандартного C была бы
глупой. Единственная причина, по которой я могу это сделать, заключается в том, что у вас есть
требование создать такой файл в системах, отличных от Windows, или, возможно,
в системах Windows, на которых не установлен Excel (что-то, что
исходный постер прямо не просил). Microsoft, которая контролирует
формат ".xls", вряд ли будет очень полезна для выполнения такого
требования.
Файлы Excel используют системный формат, поэтому для работы с ними требуется системный
код. Нет ничего плохого в написании кода,
специфичного для системы, когда это уместно (любые дураки, которые думают, что я
"религиозный фанатик" в этом вопросе, обратите внимание); это просто не
место для обсуждения деталей.
Остановимся на этом. Если исходное сообщение интересно, мы можем
обсудить это в группе lcc.
Браво! Надеюсь, это войдет в привычку.
(Если это можно сделать с помощью функций, характерных для Windows, но
не для lcc-win32, возможно,
более подходящей была бы группа программирования MS Windows. Поскольку я действительно мало что знаю об этих деталях,
я здесь только догадываюсь.)
В 100% стандартном C вы можете сделать это с помощью
/Пожалуйста/ укажите контекст.
И мне нравится, как вы использовали слово "стандартный" и полностью избегали
слова "портативный". Смысл наличия стандартов в том, что у вас есть приличный
уровень переносимости.
--
"Каждое простое число в серии как шутка
Я прояснил все закономерности, когда сделал последнюю затяжку"
- - Эндрю Поелстра
Файлы Excel являются двоичными и чаще всего используются на платформах,
где различие между двоичными и текстовыми файлами имеет смысл.
Поэтому ОП рекомендуется использовать «wb» вместо «w».
OP указал "файл excel". Из чего он состоит,
не указано ни в одном стандарте C, поэтому, не имея других конкретных
спецификаций, я придерживаюсь своего решения. Думаю, это Красная
Королева сказала, что "файл excel означает именно то, что я
имею в виду".
Однако вполне может оказаться, что "wb" подходит лучше.
--
«Власть исполнительной власти бросить человека в тюрьму без
формулирования какого-либо обвинения, известного закону, и, в частности,
отказать ему в суждении равных, является в высшей степени
одиозна и лежит в основе всякого тоталитарного правления,
будь то нацистское или коммунистическое». -- У. Черчилль, 21 ноября 1943 г.
Кит Томпсон пишет: jacob navia пишет:
В 100% стандартном C вы можете сделать это с помощью
Помимо других непереносимых устройств, которые уже были
упомянуты, у меня есть MS Excel на моем компьютере, но его нет на моем
приводе DVD (D:).
Если ваша программа изначально непереносима, мало смысла
избегать использования нестандартных расширений, которые будут выполнять работу
лучше, чем system(). Конечно, использование таких расширений
сделало бы программу неактуальной в этой группе новостей -- что всего лишь означает,
что ее следует обсудить в *другой* группе новостей, возможно, в одной
полной группе новостей. экспертов, которые могут знать лучшие способы создания файлов Excel.
ShellExecute позволяет игнорировать путь
исполняемого файла excel. system() не так умна, и в этом случае путь
зашит. Таким образом, программа не является переносимой, но ее можно заставить работать на
любой машине с Excel без особых усилий :-)
На самом деле, в Windows есть команды, которые вы могли бы использовать,
не полагаясь на знание того, где находится Excel, или даже на знание того,
какое приложение использовать. Однако, как это сделать, здесь не по теме.
Конечно, lcc-win32 предлагает возможность использования диспетчерского
интерфейса Excel и динамического заполнения ячеек, заставляя Excel
отображать графику данных, что угодно. Но если бы я опубликовал это
, это была бы программа на 1500 строк, полная оконного кода. содрогаюсь.
Остановимся на этом. Если исходное сообщение интересно, мы можем
обсудить это в группе lcc.
fopen() файл с режимом "wb" (бинарная запись),
затем fwrite() или fprintf() или putc() или fputc(), что вам нужно.
Возможно, вам следует избегать использования функций putw() и fputs():
putw() работает с типом "int", который
неодинаков по размеру во всех системах; а fputs() включает завершающий символ новой строки,
который не является одним и тем же символом (символами) во всех системах.
Теперь вам нужно знать, какова структура файла Excel.
Это тема, выходящая за рамки стандарта C, и
может быть изменена Microsoft без предварительного уведомления ("Документирование
структуры файлов вредит нашей способности к инновациям!!") Inc. р>
fgets() прочитает строку, включая завершающую новую строку, и завершит ее
с помощью '\0' в качестве строки в памяти.
fputs() запишет строку, включая новую строку, если она есть, и
не завершающую '\0'. На самом деле fputs() будет записывать любую строку
не обращая внимания на новую строку.
--
Джо Райт
"Все должно быть сделано как можно проще, но не проще."
--- Альберт Эйнштейн ---
В этом случае лучше использовать Visual Basic! Гораздо проще и
удобнее.
Другая возможность: используйте формат CSV (значения, разделенные запятыми).
Да, CSV намного проще сделать в C, но имейте в виду, что Excel плохо
читает файл .csv. Пользователю Excel обычно приходится переформатировать
различные столбцы.
--
Джо Райт
"Все должно быть сделано как можно проще, но не проще."
--- Альберт Эйнштейн ---
И пишите в точку.
Есть еще одна проблема с кодом, которая может возникнуть особенно
в Германии: запятая может быть десятичным разделителем (эквивалентным
десятичной точке), а ожидаемый разделитель полей может быть
/> точка с запятой. Число 1,2 в файле может быть интерпретировано как 1 + 2/10
(1.2), а не как указание границы между двумя ячейками.
Удивительно, но Excel может читать настоящие файлы C(!)SV, даже если
в Windows установлены неамериканские настройки (по крайней мере, голландские); хотя
Мне еще предстоит найти возможность написать его.
По крайней мере, CSV-файлы могут быть написаны с помощью надлежащего кода C, без необходимости
прибегать к библиотекам, специфичным для MS. Обычные файлы Excel могут быть только
аппроксимированы
Эндрю Поэльстра написал: Зеро написал: Джениффер Шриб:
Мне нужно создать файл Excel с помощью программы на C, а затем заполнить
его. Как это можно сделать?
В этом случае лучше использовать Visual Basic! Гораздо проще и удобнее.
Ты подонок. VB - это не язык. «Языки» работают более чем в одной
среде.
Ну, требования включают в себя приложение, которое в основном
доступно только на одной платформе.
Нет, в требования входит написание файла для этого приложения. Это
можно сделать на платформе, на которой указанное приложение не работает само по себе.
В этом случае VB (или одна из встроенных
VB-подобных штуковин в Office) будет достойным выбором.
Это редко, если вообще когда-либо.
Какой тип файла Excel? Excel поддерживает множество форматов для
импорта/экспорта.
Если это настоящий формат файла "xls", вам необходимо
ознакомиться с записью и чтением двоичных файлов в C. Google
покажет вам, как это сделать. Чтение и запись двоичных файлов имеют свои особенности
в обычном текстовом режиме ascii: также могут быть
зависимые от платформы проблемы.
Вот объяснение формата файла Excel: я не могу комментировать
точность. Есть много сложностей, которые нужно учитывать: порядок байтов,
дополнение структуры до имени, но 2.
Есть два способа импортировать данные из текстового файла в Excel: вы можете открыть его в Excel или импортировать как диапазон внешних данных. Чтобы экспортировать данные из Excel в текстовый файл, используйте команду «Сохранить как» и измените тип файла в раскрывающемся меню.
Существует два широко используемых формата текстовых файлов:
Текстовые файлы с разделителями (.txt), в которых символ TAB (код символа ASCII 009) обычно разделяет каждое поле текста.
Текстовые файлы значений, разделенных запятыми (.csv), в которых символ запятой (,) обычно разделяет каждое поле текста.
Вы можете изменить символ-разделитель, который используется как в текстовых файлах с разделителями, так и в текстовых файлах .csv. Это может быть необходимо, чтобы убедиться, что операция импорта или экспорта работает так, как вы хотите.
Примечание. Вы можете импортировать или экспортировать до 1 048 576 строк и 16 384 столбцов.
Импортируйте текстовый файл, открыв его в Excel
Текстовый файл, созданный в другой программе, можно открыть как книгу Excel с помощью команды "Открыть". Открытие текстового файла в Excel не меняет формат файла — вы можете увидеть это в строке заголовка Excel, где имя файла сохраняет расширение имени текстового файла (например, .txt или .csv). р>
Выберите «Файл» > «Открыть» и перейдите в папку, содержащую текстовый файл.
Выберите «Текстовые файлы» в раскрывающемся списке типов файлов в диалоговом окне «Открыть».
Найдите текстовый файл, который хотите открыть, и дважды щелкните его.
Если это текстовый файл (.txt), Excel запускает мастер импорта текста. Когда вы закончите с шагами, нажмите «Готово», чтобы завершить операцию импорта. Дополнительную информацию о разделителях и дополнительных параметрах см. в Мастере импорта текста.
Если файл имеет формат .csv, Excel автоматически открывает текстовый файл и отображает данные в новой книге.
Примечание. Когда Excel открывает CSV-файл, он использует текущие настройки формата данных по умолчанию для интерпретации того, как импортировать каждый столбец данных. Если вам нужна большая гибкость при преобразовании столбцов в другие форматы данных, вы можете использовать мастер импорта текста. Например, формат столбца данных в CSV-файле может быть MDY, но формат данных Excel по умолчанию — YMD, или вы хотите преобразовать столбец чисел, содержащий начальные нули, в текст, чтобы сохранить начальные нули. Чтобы заставить Excel запустить мастер импорта текста, вы можете изменить расширение имени файла с .csv на .txt, прежде чем открывать его, или вы можете импортировать текстовый файл, подключившись к нему (дополнительные сведения см. в следующем разделе).
Импортировать текстовый файл, подключившись к нему (Power Query)
Вы можете импортировать данные из текстового файла в существующий лист.
На вкладке "Данные" в группе "Получить и преобразовать данные" нажмите "Из текста/CSV".
В диалоговом окне "Импорт данных" найдите и дважды щелкните текстовый файл, который нужно импортировать, и нажмите "Импорт".
В диалоговом окне предварительного просмотра у вас есть несколько вариантов:
Выберите Загрузить, если вы хотите загрузить данные непосредственно на новый лист.
Кроме того, выберите Загрузить в, если вы хотите загрузить данные в таблицу, сводную таблицу/сводную диаграмму, существующий/новый лист Excel или просто создать подключение. Вы также можете добавить свои данные в модель данных.
Выберите «Преобразовать данные», если вы хотите загрузить данные в Power Query и отредактировать их перед переносом в Excel.
Если Excel не преобразует определенный столбец данных в нужный формат, вы можете преобразовать данные после их импорта. Дополнительные сведения см. в разделах Преобразование чисел, сохраненных в виде текста, в числа и Преобразование дат, сохраненных в виде текста, в даты.
Экспортировать данные в текстовый файл, сохранив его
Вы можете преобразовать рабочий лист Excel в текстовый файл с помощью команды "Сохранить как".
Выберите «Файл» > «Сохранить как».
Нажмите "Обзор".
В диалоговом окне "Сохранить как" в поле "Тип файла" выберите формат текстового файла для рабочего листа; например, нажмите «Текст» (с разделителями табуляции) или «CSV» (с разделителями-запятыми).
Примечание. Различные форматы поддерживают разные наборы функций. Дополнительные сведения о наборах функций, поддерживаемых различными форматами текстовых файлов, см. в разделе Форматы файлов, поддерживаемые в Excel.
Перейдите к месту, где вы хотите сохранить новый текстовый файл, и нажмите "Сохранить".
Появится диалоговое окно с напоминанием о том, что в новый файл будет сохранен только текущий рабочий лист. Если вы уверены, что текущий рабочий лист — это тот, который вы хотите сохранить в виде текстового файла, нажмите «ОК». Вы можете сохранить другие рабочие листы как отдельные текстовые файлы, повторив эту процедуру для каждого рабочего листа.
Вы также можете увидеть предупреждение под лентой о том, что некоторые функции могут быть потеряны, если вы сохраните книгу в формате CSV.
Дополнительную информацию о сохранении файлов в других форматах см. в разделе Сохранение книги в другом формате файла.
Импортировать текстовый файл, подключившись к нему
Вы можете импортировать данные из текстового файла в существующий лист.
Нажмите на ячейку, в которую вы хотите поместить данные из текстового файла.
На вкладке "Данные" в группе "Получить внешние данные" нажмите "Из текста".
В диалоговом окне "Импорт данных" найдите и дважды щелкните текстовый файл, который нужно импортировать, и нажмите "Импорт".
Следуйте инструкциям мастера импорта текста. Нажмите «Справка» на любой странице мастера импорта текста, чтобы получить дополнительные сведения об использовании мастера. Когда вы закончите шаги мастера, нажмите Готово, чтобы завершить операцию импорта.
В диалоговом окне "Импорт данных" выполните следующие действия:
В разделе Куда вы хотите поместить данные? выполните одно из следующих действий:
Чтобы вернуть данные в выбранное место, щелкните Существующий лист.
Чтобы вернуть данные в левый верхний угол нового рабочего листа, нажмите "Новый рабочий лист".
При необходимости нажмите "Свойства", чтобы установить параметры обновления, форматирования и макета для импортированных данных.
Excel помещает диапазон внешних данных в указанное вами место.
Если Excel не преобразует столбец данных в нужный формат, вы можете преобразовать данные после их импорта. Дополнительные сведения см. в разделах Преобразование чисел, сохраненных в виде текста, в числа и Преобразование дат, сохраненных в виде текста, в даты.
Экспортировать данные в текстовый файл, сохранив его
Вы можете преобразовать рабочий лист Excel в текстовый файл с помощью команды "Сохранить как".
Выберите «Файл» > «Сохранить как».
Появится диалоговое окно "Сохранить как".
В поле "Тип файла" выберите формат текстового файла для листа.
Например, нажмите Текст (с разделителями табуляции) или CSV (с разделителями-запятыми).
Примечание. Различные форматы поддерживают разные наборы функций. Дополнительные сведения о наборах функций, поддерживаемых различными форматами текстовых файлов, см. в разделе Форматы файлов, поддерживаемые в Excel.
Перейдите к месту, где вы хотите сохранить новый текстовый файл, и нажмите "Сохранить".
Появится диалоговое окно с напоминанием о том, что в новый файл будет сохранен только текущий рабочий лист. Если вы уверены, что текущий рабочий лист — это тот, который вы хотите сохранить в виде текстового файла, нажмите «ОК». Вы можете сохранить другие рабочие листы как отдельные текстовые файлы, повторив эту процедуру для каждого рабочего листа.
Появится второе диалоговое окно с напоминанием о том, что ваш рабочий лист может содержать функции, не поддерживаемые форматами текстовых файлов. Если вас интересует только сохранение данных рабочего листа в новый текстовый файл, нажмите «Да». Если вы не уверены и хотели бы узнать больше о том, какие функции Excel не поддерживаются форматами текстовых файлов, нажмите «Справка», чтобы получить дополнительную информацию.
Дополнительную информацию о сохранении файлов в других форматах см. в разделе Сохранение книги в другом формате файла.
Способ изменения разделителя при импорте зависит от того, как вы импортируете текст.
Если вы используете «Получить и преобразовать данные» > «Из текста/CSV», после выбора текстового файла и нажатия кнопки «Импорт» выберите символ для использования из списка в разделе «Разделитель». Вы можете сразу же увидеть результат своего нового выбора в предварительном просмотре данных, поэтому вы можете быть уверены, что сделали правильный выбор, прежде чем продолжить.
Если вы используете мастер импорта текста для импорта текстового файла, вы можете изменить разделитель, используемый для операции импорта, на шаге 2 мастера импорта текста.На этом шаге вы также можете изменить способ обработки последовательных разделителей, таких как последовательные кавычки.
Дополнительную информацию о разделителях и дополнительных параметрах см. в Мастере импорта текста.
Если вы хотите использовать точку с запятой в качестве разделителя списка по умолчанию при сохранении файла .csv, но вам нужно ограничить изменение Excel, рассмотрите возможность изменения десятичного разделителя по умолчанию на запятую. В этом случае Excel будет использовать точку с запятой. -двоеточие для разделителя списка. Очевидно, что это также изменит способ отображения десятичных чисел, поэтому рассмотрите возможность изменения разделителя тысяч, чтобы избежать путаницы.
Очистить параметры Excel > Дополнительно > Параметры редактирования > Использовать системные разделители.
Установите для десятичного разделителя значение , (запятая).
Установите для разделителя тысяч значение . (точка).
При сохранении книги в виде CSV-файла разделителем списка по умолчанию является запятая. Вы можете изменить его на другой символ-разделитель, используя настройки региона Windows.
Внимание! Изменение настроек Windows вызовет глобальные изменения на вашем компьютере, затрагивающие все приложения. Чтобы изменить разделитель только для Excel, см. раздел Изменение разделителя списка по умолчанию для сохранения файлов в виде текста (.csv) в Excel.
В Microsoft Windows 10 щелкните правой кнопкой мыши кнопку "Пуск" и выберите "Параметры".
Нажмите «Время и язык», а затем нажмите «Регион» на левой панели.
На главной панели в разделе «Региональные настройки» нажмите «Дополнительные настройки даты, времени и региона».
В разделе "Регион" нажмите "Изменить формат даты, времени или чисел".
В диалоговом окне "Регион" на вкладке "Формат" нажмите "Дополнительные параметры".
В диалоговом окне "Настройка формата" на вкладке "Числа" введите символ, который будет использоваться в качестве нового разделителя в поле "Разделитель списка".
Дважды нажмите "ОК".
В Microsoft Windows нажмите кнопку "Пуск" и выберите "Панель управления".
В разделе Часы, язык и регион нажмите Изменить формат даты, времени или чисел.
В диалоговом окне "Регион" на вкладке "Формат" нажмите "Дополнительные параметры".
В диалоговом окне "Настройка формата" на вкладке "Числа" введите символ, который будет использоваться в качестве нового разделителя в поле "Разделитель списка".
Дважды нажмите "ОК".
Примечание. После изменения символа-разделителя списка на вашем компьютере все программы используют новый символ в качестве разделителя списка. Вы можете изменить символ обратно на символ по умолчанию, выполнив ту же процедуру.
Нужна дополнительная помощь?
Вы всегда можете обратиться к эксперту в техническом сообществе Excel или получить поддержку в сообществе ответов.
Читайте также: