Как заполнить ListView листом Excel? (C#, Windows Формы) - PullRequest
1 голос
/ 22 апреля 2020

Вопрос в названии. Я не нашел ответа на inte rnet. Проблема: я не могу использовать OleDbConnection, потому что мне нужно отправить файл кому-то другому.

Я устал искать ответ, который может не существовать, я был бы очень признателен, если бы кто-то мог мне помочь.

Вот мой код, я застрял на начинке:

public partial class Form1 : Form
{
    string fname;

    public Form1()
    {
        InitializeComponent();

        fname = "";
        OpenFileDialog fdlg = new OpenFileDialog();
        fdlg.Title = "Excel File Dialog";
        fdlg.InitialDirectory = @"c:\";
        fdlg.Filter = "Excel .csv (*.csv)|*.csv";
        fdlg.FilterIndex = 1;
        fdlg.RestoreDirectory = true;
        if (fdlg.ShowDialog() == DialogResult.OK)
        {
            fname = fdlg.FileName;
        }

        Microsoft.Office.Interop.Excel.Application xla = new Microsoft.Office.Interop.Excel.Application();
        xla.Visible = true;
        Microsoft.Office.Interop.Excel.Workbook wb = xla.Workbooks.Open(fname);
        Microsoft.Office.Interop.Excel.Worksheet ws = wb.Worksheets[1];
        Microsoft.Office.Interop.Excel.Range xlRange = ws.UsedRange;

        int rowCount = xlRange.Rows.Count;
        int colCount = xlRange.Columns.Count;

        for (int i = 0; i <= rowCount; i++)
        {
            for (int j = 1; j <= colCount; j++)
            {
                listView.Columns.Add(xlRange.Columns.Text);     //This line is not working
            }
        }

        xla.Quit();
        xla = null;
    }

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Я использовал следующее для чтения данных в большой объект

object [,] values ​​= (object [,]) xlRange.Value2;

и доступ к ним с помощью: строка nextVal = значения [iRow, iCol] в виде строки;

0 голосов
/ 22 апреля 2020

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

Таким образом, вы можете прочитать каждую строку и разделить ее разделителем , Затем вы можете выполнить итерацию по каждой строке (= строка Excel) и внутри по разделенному массиву (= столбец / ячейка Excel).

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

Чтобы получить полное рабочее решение:

public Form1()
{
    InitializeComponent();

    OpenFileDialog fdlg = new OpenFileDialog();
    fdlg.Title = "Excel File Dialog";
    fdlg.InitialDirectory = @"c:\";
    fdlg.Filter = "Excel .csv (*.csv)|*.csv";
    fdlg.FilterIndex = 1;
    fdlg.RestoreDirectory = true;

    if (fdlg.ShowDialog() == DialogResult.OK)
    {
        var lines = File.ReadAllLines(fdlg.FileName);
        int rowCount = lines.Length;

        for (int i = 0; i < rowCount; i++)
        {
            // split the row into cell values
            var cells = lines[i].Split(';');

            if (i == 0) // first row -> create column headers
            {
                for (int j = 0; j < cells.Length; j++)
                {
                    listView.Columns.Add(cells[j]);
                }
            }
            else // not first row -> add values
            {
                // list view is organized as rows -> create a new row and add first item
                var newListViewRow = listView.Items.Add(cells[0]);

                // then add the rest of the values as subitems to the listview row
                for (int j = 1; j < cells.Length; j++)
                {
                    newListViewRow.SubItems.Add(cells[j]);
                }
            }
        }
    }
}
  • Лучше переместить код в обработчик события Load.
  • Убедитесь, что для свойства View представления списка установлено значение Details
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...