Запись ячеек в файл excel

Если честно, то идей нет.

вы пишите: «программа каждый раз создает новый ексель и старые данные не сохраняются?»
Это вопрос? у вас в конце предложения стоит вопросительный знак.
Ну, да, у вас каждый раз создаётся новый Excel в строке
Excel.Application excelApp = new Excel.Application();
и даже создаётся новая Книга
excelApp.Workbooks.Add();

По вашему коду файл должен сохраняться в этой строке
workSheet.SaveAs(string.Format(@»{0}Price.xlsx», Environment.CurrentDirectory));

я попробовал вот такой код, файл у меня сохраняется. Правда я сохраняю Книгу, а не Лист, как это делаете вы в вашем коде

C#
1
2
3
4
5
6
7
8
9
10
            Excel.Application excelApp = new Excel.Application();
            Excel.Workbook workBook = excelApp.Workbooks.Add();
            Excel.Worksheet workSheet = workBook.ActiveSheet;
            workSheet.Cells[1, "A"] = "NameCompany";
            workSheet.Cells[1, "B"] = "Site";
            workSheet.Cells[1, "C"] = "Cost";
            workBook.Close(true, "G:\C#\Price.xlsx"); 
            excelApp.Quit();
            MessageBox.Show("Файл успешно сохранён!");
        }

вот с этим циклом я не очень понял

C#
1
2
3
4
5
6
7
foreach (Price c in vPices)
            {
                row++;
                workSheet.Cells[parsers, "A"] = c.Name;
                workSheet.Cells[parsers, "B"] = c.Site;
                workSheet.Cells[parsers, "C"] = c.Cost;
            }

Почему вы используете parsers вместо row в строках workSheet.Cells[parsers, «A»] ?
Переменная row будет увеличиваться в цикле, а вот на счёт parsers я не уверен

Обращение к ячейке на листе Excel из кода VBA по адресу, индексу и имени. Чтение информации из ячейки. Очистка значения ячейки. Метод ClearContents объекта Range.

Обращение к ячейке по адресу

Допустим, у нас есть два открытых файла: «Книга1» и «Книга2», причем, файл «Книга1» активен и в нем находится исполняемый код VBA.

В общем случае при обращении к ячейке неактивной рабочей книги «Книга2» из кода файла «Книга1» прописывается полный путь:

Workbooks(«Книга2.xlsm»).Sheets(«Лист2»).Range(«C5»)

Workbooks(«Книга2.xlsm»).Sheets(«Лист2»).Cells(5, 3)

Workbooks(«Книга2.xlsm»).Sheets(«Лист2»).Cells(5, «C»)

Workbooks(«Книга2.xlsm»).Sheets(«Лист2»).[C5]

Удобнее обращаться к ячейке через свойство рабочего листа Cells(номер строки, номер столбца), так как вместо номеров строк и столбцов можно использовать переменные. Обратите внимание, что при обращении к любой рабочей книге, она должна быть открыта, иначе произойдет ошибка. Закрытую книгу перед обращением к ней необходимо открыть.

Теперь предположим, что у нас в активной книге «Книга1» активны «Лист1» и ячейка на нем «A1». Тогда обращение к ячейке «A1» можно записать следующим образом:

ActiveCell

Range(«A1»)

Cells(1, 1)

Cells(1, «A»)

[A1]

Точно также можно обращаться и к другим ячейкам активного рабочего листа, кроме обращения ActiveCell, так как активной может быть только одна ячейка, в нашем примере – это ячейка «A1».

Если мы обращаемся к ячейке на неактивном листе активной рабочей книги, тогда необходимо указать этот лист:

‘по основному имени листа

Лист2.Cells(2, 7)

‘по имени ярлыка

Sheets(«Имя ярлыка»).Cells(3, 8)

Имя ярлыка может совпадать с основным именем листа. Увидеть эти имена можно в окне редактора VBA в проводнике проекта. Без скобок отображается основное имя листа, в скобках – имя ярлыка.

Обращение к ячейке по индексу

К ячейке на рабочем листе можно обращаться по ее индексу (порядковому номеру), который считается по расположению ячейки на листе слева-направо и сверху-вниз.

Например, индекс ячеек в первой строке равен номеру столбца. Индекс ячеек во второй строке равен количеству ячеек в первой строке (которое равно общему количеству столбцов на листе, зависящему от версии Excel) плюс номер столбца. Индекс ячеек в третьей строке равен количеству ячеек в двух первых строках плюс номер столбца. И так далее.

Для примера, Cells(4) та же ячейка, что и Cells(1, 4). Используется такое обозначение редко, тем более, что у разных версий Excel может быть разным количество столбцов и строк на рабочем листе.

По индексу можно обращаться к ячейке не только на всем рабочем листе, но и в отдельном диапазоне. Нумерация ячеек осуществляется в пределах заданного диапазона по тому же правилу: слева-направо и сверху-вниз. Вот индексы ячеек диапазона Range(«A1:C3»):

Индексы ячеек в диапазоне Range("A1:C3")

Обращение к ячейке Range("A1:C3").Cells(5) соответствует выражению Range("B2").

Обращение к ячейке по имени

Если ячейке на рабочем листе Excel присвоено имя (Формулы –> Присвоить имя), то обращаться к ней можно по присвоенному имени.

Допустим одной из ячеек присвоено имя – «Итого», тогда обратиться к ней можно – Range("Итого").

Запись информации в ячейку

Содержание ячейки определяется ее свойством «Value», которое в VBA Excel является свойством по умолчанию и его можно явно не указывать. Записывается информация в ячейку при помощи оператора присваивания «=»:

Cells(2, 4).Value = 15

Cells(2, 4) = 15

Range(«A1») = «Этот текст записываем в ячейку»

ActiveCell = 28 + 10*36

Вместе с числами и текстом можно использовать переменные. Примеры здесь и ниже приведены для активного листа. Для неактивных листов дополнительно необходимо указывать имя листа, как в разделе «Обращение к ячейке».

Чтение информации из ячейки

Считать информацию из ячейки в переменную можно также при помощи оператора присваивания «=»:

Sub Test()

Dim a1 As Integer, a2 As Integer, a3 As Integer

Range(«A3») = 6

Cells(2, 5) = 15

a1 = Range(«A3»)

a2 = Cells(2, 5)

a3 = a1 * a2

MsgBox a3

End Sub

Точно также можно обмениваться информацией между ячейками:

Cells(2, 2) = Range(«A4»)

Очистка значения ячейки

Очищается ячейка от значения с помощью метода ClearContents. Кроме того, можно присвоить ячейке значение нуля. пустой строки или Empty:

Cells(10, 2).ClearContents

Range(«D23») = 0

ActiveCell = «»

Cells(5, «D») = Empty

Pandas можно использовать для чтения и записи файлов Excel с помощью Python. Это работает по аналогии с другими форматами. В этом материале рассмотрим, как это делается с помощью DataFrame.

Помимо чтения и записи рассмотрим, как записывать несколько DataFrame в Excel-файл, как считывать определенные строки и колонки из таблицы и как задавать имена для одной или нескольких таблиц в файле.

Установка Pandas

Для начала Pandas нужно установить. Проще всего это сделать с помощью pip.

Если у вас Windows, Linux или macOS:

pip install pandas # или pip3

В процессе можно столкнуться с ошибками ModuleNotFoundError или ImportError при попытке запустить этот код. Например:

ModuleNotFoundError: No module named 'openpyxl'

В таком случае нужно установить недостающие модули:

pip install openpyxl xlsxwriter xlrd  # или pip3

Будем хранить информацию, которую нужно записать в файл Excel, в DataFrame. А с помощью встроенной функции to_excel() ее можно будет записать в Excel.

Сначала импортируем модуль pandas. Потом используем словарь для заполнения DataFrame:


import pandas as pd

df = pd.DataFrame({'Name': ['Manchester City', 'Real Madrid', 'Liverpool',
'FC Bayern München', 'FC Barcelona', 'Juventus'],
'League': ['English Premier League (1)', 'Spain Primera Division (1)',
'English Premier League (1)', 'German 1. Bundesliga (1)',
'Spain Primera Division (1)', 'Italian Serie A (1)'],
'TransferBudget': [176000000, 188500000, 90000000,
100000000, 180500000, 105000000]})

Ключи в словаре — это названия колонок. А значения станут строками с информацией.

Теперь можно использовать функцию to_excel() для записи содержимого в файл. Единственный аргумент — это путь к файлу:


df.to_excel('./teams.xlsx')

А вот и созданный файл Excel:

файл Excel в python

Стоит обратить внимание на то, что в этом примере не использовались параметры. Таким образом название листа в файле останется по умолчанию — «Sheet1». В файле может быть и дополнительная колонка с числами. Эти числа представляют собой индексы, которые взяты напрямую из DataFrame.

Поменять название листа можно, добавив параметр sheet_name в вызов to_excel():


df.to_excel('./teams.xlsx', sheet_name='Budgets', index=False)

Также можно добавили параметр index со значением False, чтобы избавиться от колонки с индексами. Теперь файл Excel будет выглядеть следующим образом:

Чтение и запись файлов Excel (XLSX) в Python

Запись нескольких DataFrame в файл Excel

Также есть возможность записать несколько DataFrame в файл Excel. Для этого можно указать отдельный лист для каждого объекта:


salaries1 = pd.DataFrame({'Name': ['L. Messi', 'Cristiano Ronaldo', 'J. Oblak'],
'Salary': [560000, 220000, 125000]})

salaries2 = pd.DataFrame({'Name': ['K. De Bruyne', 'Neymar Jr', 'R. Lewandowski'],
'Salary': [370000, 270000, 240000]})

salaries3 = pd.DataFrame({'Name': ['Alisson', 'M. ter Stegen', 'M. Salah'],
'Salary': [160000, 260000, 250000]})

salary_sheets = {'Group1': salaries1, 'Group2': salaries2, 'Group3': salaries3}
writer = pd.ExcelWriter('./salaries.xlsx', engine='xlsxwriter')

for sheet_name in salary_sheets.keys():
salary_sheets[sheet_name].to_excel(writer, sheet_name=sheet_name, index=False)

writer.save()

Здесь создаются 3 разных DataFrame с разными названиями, которые включают имена сотрудников, а также размер их зарплаты. Каждый объект заполняется соответствующим словарем.

Объединим все три в переменной salary_sheets, где каждый ключ будет названием листа, а значение — объектом DataFrame.

Дальше используем движок xlsxwriter для создания объекта writer. Он и передается функции to_excel().

Перед записью пройдемся по ключам salary_sheets и для каждого ключа запишем содержимое в лист с соответствующим именем. Вот сгенерированный файл:

Чтение и запись файлов Excel (XLSX) в Python

Можно увидеть, что в этом файле Excel есть три листа: Group1, Group2 и Group3. Каждый из этих листов содержит имена сотрудников и их зарплаты в соответствии с данными в трех DataFrame из кода.

Параметр движка в функции to_excel() используется для определения модуля, который задействуется библиотекой Pandas для создания файла Excel. В этом случае использовался xslswriter, который нужен для работы с классом ExcelWriter. Разные движка можно определять в соответствии с их функциями.

В зависимости от установленных в системе модулей Python другими параметрами для движка могут быть openpyxl (для xlsx или xlsm) и xlwt (для xls). Подробности о модуле xlswriter можно найти в официальной документации.

Наконец, в коде была строка writer.save(), которая нужна для сохранения файла на диске.

Чтение файлов Excel с python

По аналогии с записью объектов DataFrame в файл Excel, эти файлы можно и читать, сохраняя данные в объект DataFrame. Для этого достаточно воспользоваться функцией read_excel():


top_players = pd.read_excel('./top_players.xlsx')
top_players.head()

Содержимое финального объекта можно посмотреть с помощью функции head().

Примечание:

Этот способ самый простой, но он и способен прочесть лишь содержимое первого листа.

Посмотрим на вывод функции head():

Name Age Overall Potential Positions Club
0 L. Messi 33 93 93 RW,ST,CF FC Barcelona
1 Cristiano Ronaldo 35 92 92 ST,LW Juventus
2 J. Oblak 27 91 93 GK Atlético Madrid
3 K. De Bruyne 29 91 91 CAM,CM Manchester City
4 Neymar Jr 28 91 91 LW,CAM Paris Saint-Germain

Pandas присваивает метку строки или числовой индекс объекту DataFrame по умолчанию при использовании функции read_excel().

Это поведение можно переписать, передав одну из колонок из файла в качестве параметра index_col:


top_players = pd.read_excel('./top_players.xlsx', index_col='Name')
top_players.head()

Результат будет следующим:

Name Age Overall Potential Positions Club
L. Messi 33 93 93 RW,ST,CF FC Barcelona
Cristiano Ronaldo 35 92 92 ST,LW Juventus
J. Oblak 27 91 93 GK Atlético Madrid
K. De Bruyne 29 91 91 CAM,CM Manchester City
Neymar Jr 28 91 91 LW,CAM Paris Saint-Germain

В этом примере индекс по умолчанию был заменен на колонку «Name» из файла. Однако этот способ стоит использовать только при наличии колонки со значениями, которые могут стать заменой для индексов.

Чтение определенных колонок из файла Excel

Иногда удобно прочитать содержимое файла целиком, но бывают случаи, когда требуется получить доступ к определенному элементу. Например, нужно считать значение элемента и присвоить его полю объекта.

Это делается с помощью функции read_excel() и параметра usecols. Например, можно ограничить функцию, чтобы она читала только определенные колонки. Добавим параметр, чтобы он читал колонки, которые соответствуют значениям «Name», «Overall» и «Potential».

Для этого укажем числовой индекс каждой колонки:


cols = [0, 2, 3]

top_players = pd.read_excel('./top_players.xlsx', usecols=cols)
top_players.head()

Вот что выдаст этот код:

Name Overall Potential
0 L. Messi 93 93
1 Cristiano Ronaldo 92 92
2 J. Oblak 91 93
3 K. De Bruyne 91 91
4 Neymar Jr 91 91

Таким образом возвращаются лишь колонки из списка cols.

В DataFrame много встроенных возможностей. Легко изменять, добавлять и агрегировать данные. Даже можно строить сводные таблицы. И все это сохраняется в Excel одной строкой кода.

Рекомендую изучить DataFrame в моих уроках по Pandas.

Выводы

В этом материале были рассмотрены функции read_excel() и to_excel() из библиотеки Pandas. С их помощью можно считывать данные из файлов Excel и выполнять запись в них. С помощью различных параметров есть возможность менять поведение функций, создавая нужные файлы, не просто копируя содержимое из объекта DataFrame.

Время на прочтение
5 мин

Количество просмотров 43K

В продолжение темы, начатой в предыдущей статье, хочу поделиться своим опытом экспорта данных, в частности, в формате XLSX.

Итак, кому интересно, как заполнить XLSX без больших и сложных библиотек, прошу под кат.

Недавно передо мной возникла задача экспортировать непредсказуемый по размеру объем табличных данных в формате XLSX. Как любой здравомыслящий программист, первым делом полез искать готовые решения.
Почти сразу наткнулся на библиотеку PHPExcel. Мощное решение, с кучей разных функций и возможностей. Порывшись еще немного нашел отзывы программистов о ней. В частности, на форумах встречаются жалобы на скорость работы и отказ работать с большим объемом данных. Отметил библиотеку как один из вариантов решения и начал искать дальше.
Находил еще несколько библиотек для работы с XLSX, но все они были или забытыми, т.к. не обновлялись по 2-3 года, или обязательно тянули за собой сторонние библиотеки, или использовали DOM для работы с файлами, что мне не очень нравилось. Каждый раз, натыкаясь на очередную библиотеку и изучая механизмы ее работы, ловил себя на мысли, что все это «из пушки по воробьям». Не нужно мне такое сложное решение!
Признаюсь честно, изучив поверхностно каждое из найденных решений, не стал ставить и тестировать ни одного. Мне нужно было более простое и надежное, как танк, решение.

Задача

В общем, раз не нашел ничего подходящего, значит надо сформулировать технические требования к тому, что нужно. Требования, как и следовало ожидать, оказались тривиальными:

  • Оформить экспортирующий механизм в виде автономного класса
  • Реализовать в классе набор функций для записи значений ячеек и ряда
  • Возможность работы с неограниченным объемом данных
  • Распаковка и упаковка XLSX.

Отдельно остановлюсь только на последнем пункте. Как известно, XLSX представляет собой обычный zip-архив, который можно распаковать и увидеть, что он состоит из нескольких файлов и каталогов. Обратным образом его можно упаковать и переименовать в XLSX. Если все изменения правильные, то Microsoft Excel откроет файл без проблем.

Реализация

Изначально очень хотел создавать все файлы, из которых состоит XLSX, кодом, но, к счастью, быстро понял бессмысленность своей идеи. И родилось иное, более правильно и простое решение. Надо с помощью Microsoft Excel создать файл XLSX в таком виде, в каком он нужен в итоге, но без данных, иными словами — шаблон, а потом, с помощью кода, только добавить данные!
В таком случае, класс должен будет распаковывать шаблон в отдельный каталог, вносить изменения в /xl/worksheets/sheet1.xml и упаковывать содержимое каталога обратно в XLSX.

В объявлении класса присутствуют публичные переменные:
$templateFile – имя файла шаблона
$exportDir – папка, в которую будет распакован шаблон, разумеется с необходимыми правами доступа.

Конструктор класса принимает имя будущего файла, количество колонок и рядов. Потом проверяет, что имя файла корректно, папка для распаковки шаблона существует и формирует полное имя конечной папки для распаковки шаблона.
После создания класса можно распаковать шаблон и открыть на запись sheet1.xml. На самом деле я не просто дописываю в файл, а полностью его перезаписываю. Однажды взяв из него начальную строку, вношу в нее изменение в тэге dimension, который отражает размер экспортируемого диапазона, и записываю в файл.

public function openWriter()
{
	if (is_dir($this->baseDir))
		CFileHelper::removeDirectory($this->baseDir);
	mkdir($this->baseDir);

	exec("unzip $this->templateFullFilename -d "$this->baseDir"");

	$this->workSheetHandler = fopen($this->baseDir.'/xl/worksheets/sheet1.xml', 'w+');

	fwrite($this->workSheetHandler, '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"><dimension ref="A1:'.chr(64+$this->colCount).$this->rowCount.'"/><sheetData>');
}

Обеспечить скорость работы и возможность работы с большим объемом данных позволяют функции resetRow и flushRow. Они отвечают за очистку текущего ряда в памяти и запись текущего ряда на диск.
А вот сохранение значений ячеек с разными типами оказалось не такой простой задачей.

Запись строки

Казалось бы, что сложного записать строковое значение в файл. Однако, в XLSX все не так просто. Все строки внутри XLSX хранятся в отдельном файле /xl/sharedStrings.xml. В ячейки записываются не строковые значения, а их порядковые номера — индексы. Разумное решение с точки зрения сокращения размера файла.

Но такое решение неудобно с точки зрения программного заполнения шаблона. Если выполнять указанное требование, то мне бы пришлось выполнять отдельный проход по всем строковым значениям в массиве данных, исключать повторяющиеся, сохранять их в sharedStrings.xml, проиндексировать и вместо значений в исходном массиве вписать их индексы. Медленно и неудобно.

Оказывается, можно обойти требование и сохранять строковые значения ячеек прямо в ячейках. Но в этом случае формат записи будет иной:

public function appendCellString($value)
{
	$this->curCel++;
	if (!empty($value)) {
		$value = htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
		$value = preg_replace( '/[x00-x13]/', '', $value );
		$this->currentRow[] = '<c r="'.chr(64+$this->curCel).$this->numRows.'" t="inlineStr"'.($this->isBold ? ' s="7"' : '').'><is><t>'.$value.'</t></is></c>';
		$this->numStrings++;
	}
}
Запись числа

Никаких сложностей с записью целых или дробных чисел не возникло. Все просто:

public function appendCellNum($value)
{
	$this->curCel++;
	$this->currentRow[] = '<c r="'.chr(64+$this->curCel).$this->numRows.'"><v>'.$value.'</v></c>';
}
Запись даты и времени

Дата и время хранятся в виде количества секунд прошедших с 01.01.1970 поделенных на количество секунд в сутках. Причем, в вычислении допущена ошибка с определением високосного года. В общем, не вдаваясь в подробности, которые несложно найти в сети, чтобы корректно вычислять дату пришлось объявить в классе две константы:
ZERO_TIMESTAMP – смещение даты в формате Excel от UNIX_TIMESTAMP
SEC_IN_DAY – секунд в сутках.
После вычисления значения даты и времени, целая часть дроби – это дата, дробная часть – время:

const ZERO_TIMESTAMP = 2209161600;
const SEC_IN_DAY = 86400;

public function appendCellDateTime($value)
{
	$this->curCel++;

	if (empty($value))
		$this->appendCellString('');
	else
	{
		$dt = new DateTime($value);
		$ts = $dt->getTimestamp() + self::ZERO_TIMESTAMP;
		$this->currentRow[] = '<c r="'.chr(64+$this->curCel).$this->numRows.'" s="1"><v>'.$ts/self::SEC_IN_DAY.'</v></c>';
	}
}

После записи всех данных остается закрыть рабочий лист и рабочую книгу.

Применение

Как и раньше, использование описанного класса основано на экспорте данных с помощью провайдера CArrayDataProvider. Предполагая, что объем экспортируемых данных может оказаться очень большим, применен специальный итератор CDataProviderIterator, который перебирает возвращаемые данные по 100 записей (можно указать иное число записей).

public function exportXLSX($organization, $user, &$filename)
{
	$this->_provider = new CArrayDataProvider(/*query*/);

	Yii::import('ext.AlxdExportXLSX.AlxdExportXLSX');
	$export = new AlxdExportXLSX($filename, count($this->_attributes), $this->_provider->getTotalItemCount() + 1);

	$export->openWriter();
	$export->resetRow();
	$export->openRow(true);
	foreach ($this->_attributes as $code => $format)
		$export->appendCellString($this->_objectref->getAttributeLabel($code));
	$export->closeRow();
	$export->flushRow();

	$rows = new CDataProviderIterator($this->_provider, 100);
	foreach ($rows as $row)
	{
		$export->resetRow();
		$export->openRow();

		foreach ($this->_attributes as $code => $format)
		{
			switch ($format->type)
            {
                case 'Num':
                    $export->appendCellNum($row[$code]);
                /*other types*/
                default:
                    $export->appendCellString('');					
            }
		}

		$export->closeRow();
		$export->flushRow();
	}
	$export->closeWriter();
	$export->zip();

	$filename = $export->getZipFullFileName();
}

Кому интересно, может получить исходный код моего класса AlxdExportXLSX совершенно безвозмездно.

 

Wh1Te

Пользователь

Сообщений: 4
Регистрация: 03.09.2015

Через разные формулы, получаю строку с данными текст и числа. Всего около 5-6 ячеек занято, мне нужно взять данные из всей строки и сохранить в текстовом файле, но так чтобы в текстовом файле данные разделялись точками, обычное разделение сохраняет через пробелы.

И вторая строчка, там большое количество пробелов между данными. Первую строку можно сделать через «Сцепить», вторую аналогично только пробелов добавить ?

Файл Excel и, образец файла Txt который нужен прикрепил к сообщению.

Изменено: Wh1Te03.09.2015 15:13:37

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

Wh1Te, и Вам здравствовать. В файле экселя только одна строка.

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

TSN

Пользователь

Сообщений: 217
Регистрация: 07.05.2014

#3

04.09.2015 09:10:02

Пример записи в файл тхт

Код
Sub WriteTXT()
Dim oRange As Range, sTemp As String, vl
Dim FileTxt As String, F As Integer
'''Чтение данных из книги Ексель, из диаппазона "A3:F3"
With ThisWorkbook
  Set oRange = .Sheets("Лист1").Range("A3:F3")
    For Each vl In oRange
      sTemp = sTemp & vl.Value & "."
    Next
    sTemp = Left(sTemp, Len(sTemp) - 1)
End With
''' Формирование наименования файла и Запись данных в текстовый файл
''' Это самы простой способ записи.
FileTxt = "Данные Ексель " & Format(Now, "dd-mm-yy-hh-mm-ss") & ".txt"
F = FreeFile
Open ThisWorkbook.Path & Application.PathSeparator & FileTxt For Output As #F
Print #F, sTemp
Close #F
MsgBox "Файл сформирован: " & ThisWorkbook.Path & Application.PathSeparator & FileTxt, 64, "Excel"
End Sub

Цитата
JayBhagavan написал: В файле экселя только одна строка.

Поэтому как получить все данные из файла думайте самостоятельно

Прикрепленные файлы

  • Файл.xlsm (17.3 КБ)

Изменено: TSN04.09.2015 09:12:01

 

Whitee

Пользователь

Сообщений: 4
Регистрация: 03.09.2015

Большое спасибо за написанный скрипт. Очень облегчает задачу вывода в txt. Чуть чуть донастрою уже сам)

Изменено: Whitee08.09.2015 23:07:52

 

Юрий М

Модератор

Сообщений: 60580
Регистрация: 14.09.2012

Контакты см. в профиле

Whitee, и вот зачем Вы процитировали всё целиком? Кнопка цитирования не для ответа. Исправьте свой #4.

 

Whitee

Пользователь

Сообщений: 4
Регистрация: 03.09.2015

Столкнулся с одним недостатком. В текстовом файле все строки идут друг за другом одной строчкой. А нужно чтобы в txt было так же как и в Excele осуществлялся перенос на следующую строчку

Текстовый файл — в каком виде нужно получить данные. (пробел, запятая, точка не важно. Потом сам изменю).
Главное, чтобы вы подсказали, что и куда надо дописать чтобы был перенос строки. Диапазон строк 300-500 (в итоге диапазон оставлю один постоянный)

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

#7

08.09.2015 23:46:45

Цитата
Whitee написал: Столкнулся с одним недостатком.
Цитата
JayBhagavan написал: В файле экселя только одна строка.
Цитата
из Правил форума:
2.3. Приложите файл(ы) с примером (общим весом не более 100 Кб) в реальной структуре

Вы всегда стремитесь устранять свои ошибки за чужой счёт?

Цитата
Whitee написал: Чуть чуть донастрою уже сам)

перенос на следующую строчку — это как раз «чуть-чуть»

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

kalbasiatka

Пользователь

Сообщений: 684
Регистрация: 22.12.2012

#8

09.09.2015 06:51:08

Код
Sub WriteTXT_V2()
    Dim a(), b(), c()
    Dim i&, j&
'--------------------
    a = Sheets("Лист1").UsedRange.Value
    ReDim b(1 To UBound(a) - 2)
    For i = 3 To UBound(a)
        ReDim c(1 To UBound(a, 2))
        For j = 1 To UBound(c)
            c(j) = a(i, j)
        Next
        b(i - 2) = Join(c, vbTab)
    Next
    With CreateObject("ADODB.Stream")
        .Type = 2: .Charset = "utf-8"
        .Open
        .WriteText Join(b, vbCrLf)
        .SaveToFile ThisWorkbook.Path & "как надо.txt", 2
        .Close
    End With
    Beep
End Sub
 

TSN

Пользователь

Сообщений: 217
Регистрация: 07.05.2014

#9

09.09.2015 08:45:57

Цитата
Whitee написал:
нужно чтобы в txt было так же как и в Excele осуществлялся перенос на следующую строчку

Для разнообразия вариантов еще один.

Код
Sub WriteTXT1()
Dim arr, sTemp As String, x As Long, n As Long, F As Integer
Dim FileTxt As String, FullFileName As String
  '''Чтение данных из книги Ексель, из полей "A:F" - динамически
  With ThisWorkbook.Sheets("Лист1")
    arr = .Range(.Cells(3, 1), .Cells(Rows.Count, 7).End(xlUp)).Value
      For x = 1 To UBound(arr)
        For n = 1 To 7: sTemp = sTemp & arr(x, n) & ".": Next n
        sTemp = Left(sTemp, Len(sTemp) - 1) & vbCrLf
      Next x
  End With
  Erase arr
  ''' Формирование наименования файла и Запись данных в текстовый файл
  FileTxt = "Данные Ексель " & Format(Now, "dd-mm-yy-hh-mm-ss") & ".sdr"
  FullFileName = ThisWorkbook.Path & Application.PathSeparator & FileTxt
  ''' Стандартный способ записи текстового файла в VBA.
  F = FreeFile
  Open FullFileName For Output As #F: Print #F, sTemp: Close #F
MsgBox "Файл сформирован: " & FullFileName, 64, "Excel"
End Sub

Изменено: TSN09.09.2015 08:48:08

 

Whitee

Пользователь

Сообщений: 4
Регистрация: 03.09.2015

#10

09.09.2015 14:14:28

Цитата
Для разнообразия вариантов еще один.

Работает превосходно, спасибо

 

jeka-irbis

Пользователь

Сообщений: 137
Регистрация: 05.09.2015

#11

17.09.2019 22:27:02

вопрос решен самостоятельно, всем спасибо за «помощь»))

Изменено: jeka-irbis19.09.2019 22:31:41

Все привет, в этой статье опишу исчерпывающие примеры работы с 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&#91;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;

            }

This VBA Program reads an Excel Range (Sales Data) and write to a Text file (Sales.txt)

Excel VBA code to read data from an Excel file (Sales Data – Range “A1:E26”).  Need two “For loop” for rows and columns. Write each value with a comma in the text file till the end of columns (write without comma only the last column value). Do the above step until reach the end of rows. 

Sales Data in Excel: 5 columns and 25 rows

Sales Data

VBA code to create a text file as below

VBA Code:

  • Declaring Variables :  
Variable Data Type Comments
myFileName  String Output text file (Full path with file name)
rng Range Excel range to read 
cellVal Variant Variable to assign each cell value
row Integer Iterate rows
col Integer Iterate columns
'Variable declarations
Dim myFileName As String, rng As Range, cellVal As Variant, row As Integer, col As Integer
  • Initialize variables:
    • myFileName: The file name with the full path of the output text file
    • rng: Excel range to read data from an excel.
'Full path of the text file
myFileName = "D:ExcelWriteTextsales.txt"
'Data range need to write on text file
Set rng = ActiveSheet.Range("A1:E26")

Open the output text file and assign a variable “#1”

'Open text file
Open myFileName For Output As #1

‘Nested loop to iterate both rows and columns of a given range eg: “A1:E26” [5 columns and 26 rows]

'Number of Rows
For row = 1 To rng.Rows.Count
   'Number of Columns
   For col = 1 To rng.Columns.Count

Assign the value to variable cellVal 

cellVal = rng.Cells(row, col).Value

Write cellVal with comma.  If the col is equal to the last column of a row.  write-only value without the comma.

'write cellVal on text file
    If col = rng.Columns.Count Then
        Write #1, cellVal 
    Else
        Write #1, cellVal, 
    End If

Close both for loops

   Next col
Next row

Close the file

Close #1

Approach:

Step 1: Add a shape (Create Text File) to your worksheet 

Step 2: Right-click on “Create a Text file” and “Assign Macro..”

Step 3: Select MacroToCreateTextFile

Step 4: Save your excel file as “Excel Macro-Enabled Workbook”  *.xlsm

Step 5: Click “Create Text file

Вставка или Ctrl+V, пожалуй, самый эффективный инструмент доступный нам. Но как хорошо вы владеете им? Знаете ли вы, что есть как минимум 14 различных способов вставки данных в листах Ecxel? Удивлены? Тогда читаем этот пост, чтобы стать пэйст-мастером.

Данный пост состоит из 2 частей:

— Основные приемы вставки

— Вставка с помощью обработки данных

1. Вставить значения

Вставить значения ExcelЕсли вы хотите просто вставить значения с  ячеек, последовательно нажимайте клавиши Я, М и З, удерживая при этом клавишу Alt, и в конце нажмите клавишу ввода. Это бывает необходимо, когда вам нужно избавиться от форматирования и работать только с данными.

Начиная с Excel 2010, функция вставки значений отображается во всплывающем меню при нажатии правой клавишей мыши

Вставить значения правой кнопкой Excel

 2. Вставить форматы

Вставить форматы ExcelНравиться этот чудный формат, который сделал ваш коллега? Но у вас нет времени, чтобы так же оформить свою таблицу. Не беспокойтесь, вы можете вставить форматы (включая условное форматирование) из любой скопированной ячейки. Удерживая клавишу Alt, последовательно нажимайте Я, М, Ф, Ф, Ф и в конце нажмите клавишу Ввода.

Те же самые действия можно произвести с помощью меньшего количества операций, воспользовавшись меню, которое выпадает при нажатии правой кнопки мыши (начиная с Excel 2010).

3. Вставить формулы

Иногда возникает необходимость скопировать несколько формул в новый диапазон. Для этого, удерживая клавишу Alt, последовательно нажимаем Я, М, Ф и в конце нажмите клавишу Ввода. Вы можете достичь того же эффекта, путем перетаскивания ячейки, содержащей формулу, в новый диапазон, если диапазон находится рядом.

4. Вставить проверку данных

Вставка проверки данных ExcelХотите скопировать только проверку значений, без содержимого и форматов ячейки. Для этого копируете ячейку, в котором присутствует проверка условий, щелкаете правой кнопкой мыши на ячейку, куда хотите скопировать данные. Выбираете Специальная вставка -> Условия на значения.

Условия на значения Excel

5. Скопировать ширину столбцов с других ячеек

Вашему боссу понравилась, созданная вами, табличка по отслеживанию покупок и он попросил создать еще одну, для отслеживания продаж. В новой таблице вы хотите сохранить ширину столбцов. Для этого вам нет необходимости измерять каждый столбец первой таблицы, а просто скопировать их и с помощью специальной вставки задать «Ширина столбцов».

6. Берем комментарии и вставляем в другом месте

Чтобы сократить количество перепечатываний, комментарии тоже можно вставлять копипейстом. Для этого необходимо воспользоваться специальной вставкой и указать «Вставить примечания»

7. И конечно, вставляем все подряд

В этом нам помогут сочетания клавиш Ctrl+V или Alt+Я+М или клавиша вставки на панели инструментов.

Вставка с помощью обработки данных

8. Вставка с дополнительной математической операцией

Вставка с дополнительной математической операцией ExcelК примеру, у вас имеется строка 1 со значениями 1, 2, 3, и строка 2 со значениями 4, 5, 6. И вам необходимо сложить обе строки, чтобы получить 5, 7, 9. Для этого копируем первую строку, жмем правой кнопкой мыши по строке 2, выбираем Специальная вставка, ставим переключатель на «Сложить» и жмем ОК.

Те же самые операции необходимо будет проделать, если вам требуется вычесть, умножить или разделить данные. Отличием будет, установка переключателя на нужной нам операции.

Вставка с дополнительными опреациами Excel

9. Вставка с учетом пустых ячеек

Если у вас имеется диапазон ячеек, в котором присутствуют пустые ячейки и необходимо вставить их другой диапазон, но при этом, чтобы пустые ячейки были проигнорированы.

Вставка с учетом пустых строк Excel

В диалоговом окне «Специальная вставка» установите галку «Пропускать пустые ячейки»

10. Транспонированная вставка

транспониированная вставка ExcelК примеру, у вас имеется колонка со списком значений, и вам требуется переместить (скопировать) данные в строку (т.е. вставить их поперек). Как бы вы это сделали? Ну конечно, вам следует воспользоваться специальной вставкой и в диалоговом окне установить галку «Транспонировать». Либо воспользоваться сочетанием клавиш Alt+Я, М и А.

Эта операция позволит транспонировать скопированные значения прежде, чем вставит. Таким образом, Excel преобразует строки в столбцы и, наоборот, столбцы в строки.

11. Вставить ссылку на оригинальную ячейку

Если вы хотите создать ссылки на оригинальные ячейки, вместо копипэйстинга значений, этот вариант, то, что вам нужно. Воспользуйтесь специальной вставкой, как примерах выше, и вместо кнопки «ОК» , нажмите «Вставить связь». Либо воспользуйтесь сочетанием клавиш Alt+Я, М и Ь, что создаст автоматическую ссылку на скопированный диапазон ячеек.

12. Вставить текст с разбивкой по столбцам

Эта опция полезна, когда вы вставляете данные извне. Например, если вы хотите вставить несколько строчек этого блога на лист Excel, но при этом каждое слово было в отдельном столбце. Для этого копируем текст (Ctrl+C), переходим на лист Excel и вставляем данные (Ctrl+V). У меня, по умолчанию, программа вставила строку с текстом в одну ячейку. Теперь необходимо проделать небольшой финт ушами. Идем во вкладку «Данные» -> «Текст по столбцам» и настраиваем мастер текстов. На первом шаге указываем формат данных – «с разделителями», жмем «Далее», устанавливаем символ-разделитель —  «Пробел» и «Готово». Текст, который, мы вставили в одну ячейку разбился по столбцам. Таким образом мы указали программе, как бы мы хотели воспринимать текстовые данные.

91-paste-text-import-wizard

Теперь, во время последующих вставок текста, кликаем правой кнопкой по ячейке, куда вы хотите вставить текст, выбираем «Специальная вставка» -> «Текст» -> «ОК». Excel разбил нашу строку на столбцы, что нам и требовалось.

92-paste-text-import-wizard

13. Импорт данных из интернета

Если вы хотите импортировать данные с интернета в реальном времени, вы можете воспользоваться веб-запросами Excel. Это мощный инструмент, который позволяет извлекать данные из сети (или сетевых ресурсов) и отображает их в виде электронной таблицы. Узнать больше об импорте данных вы можете прочитав статью о веб запросах Excel.

14. Какой ваш любимый способ вставки?

Есть еще много других скрытых способов вставки, таких как вставка XML-данных, изображений, объектов, файлов и т.д. Но мне интересно, какими интересными приемами вставки пользуетесь вы. Напишите, какой ваш любимый способ вставки?

Like this post? Please share to your friends:
  • Запись чисел прописью excel
  • Запись формулы расчет в ячейке ms excel начинается со знака
  • Запись формулы для электронной таблицы excel выберите верную формулу
  • Запись формулы для функции если в excel
  • Запись формулы в ms excel начинается со знаками