C # массив только повторяет первый элемент массива в поля Excel - PullRequest
1 голос
/ 16 мая 2019

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

У меня тот же код, который используется в функции сохранениявместо этого используется следующий код:

var iRowCount = xlSaveWorksheet.UsedRange.Rows.Count;

var newRow = iRowCount + 1;
var timeStamp = DateTime.Now;
var rangeStart = string.Concat("A", newRow.ToString());
var rangeEnd = string.Concat("F", newRow.ToString());


string[] stringSaveArray = new string[] { textBox_Name.Text, textBox_Number.Text, textBox_Client.Text, textBox_Site.Text, richTextBox_Description.Text, timeStamp.ToString() };
Excel.Range rng = xlSaveApp.get_Range(rangeStart, rangeEnd);
rng.Value = stringSaveArray;

Эта опция прекрасно работает, поэтому я не понимаю, почему она работает здесь, а не в другой функции

private void button_CopyTable_Click(object sender, EventArgs e)
{
    var fullTempPath = Directory.GetCurrentDirectory() + "\\temp.xlsx";
    Excel.Application xlApp = new Excel.Application();
    Excel.Workbook xlTempWorkbook = xlApp.Workbooks.Open(fullTempPath);
    Excel._Worksheet xlTempWorksheet = xlTempWorkbook.Sheets[1];

    string[] stringArray = new string[] { textBox_Name.Text, textBox_Number.Text, textBox_Client.Text, textBox_Site.Text, richTextBox_Description.Text };
    Excel.Range rng = xlApp.get_Range("B1","B5");
    rng.Value = stringArray;

    xlTempWorksheet.Range["A1:B5"].Copy();


    Marshal.ReleaseComObject(xlTempWorksheet);

    //close and release
    xlTempWorkbook.Close(false, System.Reflection.Missing.Value, System.Reflection.Missing.Value);
    Marshal.ReleaseComObject(xlTempWorkbook);

    //quit and release
    xlApp.Quit();
    Marshal.ReleaseComObject(xlApp);
}

Значенияпервый элемент массива помещается в каждую ячейку диапазона, а не в каждый элемент, попадающий в ячейку, проходящий по списку

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Многосотовые диапазоны принимают и возвращают двумерные прямоугольные массивы.Например (не проверено):

xlWorksheet.Range["A1:B1"].Value = new[,] { {1, 2} };    // for "horizontal" range

xlWorksheet.Range["A1:A2"].Value = new[,] { {1}, {2} };    // for "vertical" range

xlWorksheet.Range["A1:B2"].Value = new[,] { {1, 2}, {3, 4} };   

Одномерные массивы принимаются для горизонтальных диапазонов, но не для вертикальных.

Как упомянуто @TimWilliams в комментариях, Application.Transpose или Application.WorksheetFunction.Transpose можно использовать для преобразования одномерного массива в двумерный "вертикальный" массив:

xlWorksheet.Range["A1:A2"].Value = xlApp.Transpose(new[] { 1, 2 }); 
1 голос
/ 16 мая 2019

вместо использования rng.Value = stringArray; используйте rng.Value2 = stringArray;

Это будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...