Скажите, что у вас есть файл excel с множеством цифр и строк, около 100 строк.(C# - Excel) Как написать формулу для вновь созданного столбца для каждой существующей строки?
Я хочу программно написать столбец с формулой, которая добавляет значения связки полей для каждой существующей строки.
В первую очередь, конечно, я бы создал Openfiledialog для файла Excel, найти путь, открыть его через OleDb. Получил это. Теперь скажите, что у меня есть следующая таблица:
[Друзья | Деньги | Деньги Проиграл | Прошедшие дни | Решение]
Бильбо, 50, 50, 7, * Формула здесь
Bilso, 80, 50, 7, * Формула здесь
и т.д ...
Проблема, я дон У меня есть точное число для строк, поэтому мне придется перечислить все, что обнаружено соединением OleDb. Формула будет чем-то вроде = (B2-C2) * D2, но 2 также неверна, и она должна относиться к любой строке, в которой она находится, т. Е. Строка 3 будет = (B3-C3) * D3. Я не уверен, как это сделать.
Я узнал, что запись непосредственно в ячейку также не приводит к тому, что формула обрабатывает номера прямо.
=====
EDIT:
private Excel.Application Xls;
private Excel.Workbooks WBs;
private Excel.Workbook WB;
private Excel.Worksheet WS;
private Excel.Sheets SS;
Excel.Range cellsRange = null;
Excel.Range columnRange = null;
Excel.Range rowRange = null;
int numberOfColumns = 0;
int numberOfRows = 0;
private void btnColumn_Click(object sender, EventArgs e)
{
if (btnColumn.FlatStyle == FlatStyle.Flat)
btnColumn.FlatStyle = FlatStyle.Standard;
else
{
btnColumn.FlatStyle = FlatStyle.Flat;
}
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Excel Files|*.xls;*.xlsx";
openFileDialog.ShowDialog();
string pather = openFileDialog.FileName;
if (pather == "" || pather == " " || pather == null)
{
return;
}
if (!string.IsNullOrEmpty(openFileDialog.FileName))
{
try
{
Xls = new Excel.Application();
WBs = Xls.Workbooks;
WB = WBs.Open(pather, 0, false, 5, "", "", true,
XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
SS = WB.Worksheets;
WS = SS.get_Item(1);
cellsRange = WS.Cells;
columnRange = cellsRange.Columns;
rowRange = cellsRange.Rows;
numberOfColumns = columnRange.Count;
numberOfRows = rowRange.Count;
int LastCell = numberOfColumns+1;
WS.Cells[1, LastCell] = "Tax Formula";
for (int i = 2; i < numberOfRows; i++)
{
//string niceFormula = "=SUM(L" + i + ",M" + i + ")*N"+ i ;
//WS.Cells[i, LastCell].Formula = niceFormula;
WS.Cells[i, LastCell].Value = (WS.Cells[i, 12] + WS.Cells[i, 13]) * WS.Cells[i, 14];
}
//==========================
WB.Save();
}
catch (Exception ex)
{
MessageBox.Show("Write Excel: " + ex.Message);
}
finally
{
GC.Collect();
GC.WaitForPendingFinalizers();
WB.Close();
Xls.Quit();
releaseObject(cellsRange);
releaseObject(columnRange);
releaseObject(rowRange);
releaseObject(SS);
releaseObject(WS);
releaseObject(WBs);
releaseObject(WB);
releaseObject(Xls);
}
MessageBox.Show("Finished Updating File", "Task complete");
}
}
Кто знает, почему этот код бросает следующее сообщение об ошибке при попытке записи?
HRESULT: 0x800A03EC
употреблено в пищу весь код для вашего удобства. Он все еще выплевывает ошибку HRESULT.
Целевой элемент состоит из 4 рядов глубиной с 1 рядом заголовков и шириной около 16 колонок.
Было бы медленно обрабатывать каждую ячейку значения по одному. Я бы предложил вам получить все данные в Excel в таблицу данных и выполнить расчет (используя LINQ или обычные циклы) и добавить вычисленное значение в новый столбец в той же таблице данных. В конце экспортируйте таблицу данных в лист Excel в требуемом формате. –
Вы не сказали нам, как вы пишете дату. VBA? Или приложение Winform с Excel Interop? Или приложение WinForm с EPPlus? Пожалуйста, укажите более подробную информацию. – nabuchodonossor
@nabuchodonossor, я изначально оставил его открытым, потому что иногда кто-то приходил в готовность с ответом VBA, но отключился тегом C#. В некоторых случаях я могу преобразовать логику в один подходящий для C#, таким образом, будет больше ответов, но да, это Winform с Excel Interop. – Aroueterra