gani7787 Ответов: 1

Не удается распечатать значение таблицы данных в конкретном столбце excel с помощью C#.NET


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

У меня есть главная таблица с данными.

Когда я печатаю данные главной таблицы в excel, существует условие для замены столбца на основе данных справочной таблицы
и печать.

Шаг 1
-----
Прочтите главную таблицу. снимок экрана ниже

главная таблица


Шаг 2
-----
При печати данных в excel сначала обратитесь к столбцу, как указано ниже, и замените его, а затем распечатайте

ссылочный столбец


Шаг 3
-----
Окончательный вывод в excel после замены столбцов.

Примечание : pls. запишите главную таблицу и выведите ее в excel, там будет происходить замена столбцов.
с тех пор как колонка была обновлена.

Шаблон Вывода

Мой Исходный Код :

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

Ждем благоприятного ответа.

Что я уже пробовал:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;
using Microsoft.Office;

namespace WinForm
{
    public partial class Form1 : Form
    {
        public string country = string.Empty;
        public Excel.Application xlApp = null;
        public Excel.Workbook XLWB = null;
        public Excel.Worksheet wsht = null;
        int IdxCurr = 0;
        int IdxPrev = 0;
        string colLineNoToPrint;

        public Form1()
        {
            InitializeComponent();
          
        }

        private void button1_Click(object sender, EventArgs e)
        {
            country = comboBox1.SelectedItem.ToString();
            DataTable boundTable = new DataTable();
            DataTable dtRefColumn = RefColumn();
            if (!string.IsNullOrEmpty(country))
            {

                IEnumerable<DataRow> query = from customer in dtRefColumn.AsEnumerable()
                                where customer.Field<string>("Country_Name") == country
                                select customer;
             

                boundTable = query.CopyToDataTable<DataRow>();
            }
            else
            {

            }

            DataTable dtMaster = dtMasterData();

            //print data to output template according to reference column
            SaveToExcel(dtMaster, dtRefColumn, country);

         
        }

        public void SaveToExcel(DataTable dtMaster, DataTable dtReftable, string country)
        {
            xlApp = new Excel.Application();
            xlApp.Workbooks.Add(true);
            wsht = xlApp.Worksheets.Add();
            wsht.Name = "S2";

            if (dtMaster.Rows.Count > 0)
            {
                for (int i = 0; i < dtMaster.Rows.Count; i++)
                {

                         //************* Struggling to print rows from here ****************
                         DataView dv = new DataView(dtMaster);

                         DataTable dt = dv.ToTable(true, dtMaster.Columns[i].ToString());

                        //Get Column Name
                        string colname = dtMaster.Columns[i].ToString();
                        //Get Reference column 
                        string RefCol = (dtReftable.AsEnumerable().Where(p => p.Field<string>("Country_Name") == country && p.Field<string>("Column_Name") == colname).Select(p => p.Field<string>("Excel_column"))).FirstOrDefault();
                        int TotRows = dtMaster.Rows.Count;
                        TotRows = 12 + TotRows;

                       
                       //To Print : Excel rows Should start to print from Rows 10
                        wsht.Cells[i][10] = dt.Rows[i].ToString();
                       //************* Struggling to print rows from here ****************
                  
                }
            }
            xlApp.Visible = true;
            xlApp.ActiveWorkbook.SaveAs(@"C:\Users\CompUMZ1A\Desktop\test.xlsx");
            xlApp.Quit();
        }

        public static DataTable dtMasterData()
        {

                DataTable tblData = new DataTable();
                tblData.Columns.Add("Prod_ID", typeof(string));
                tblData.Columns.Add("Prod_Name", typeof(string));
                tblData.Columns.Add("Prod_Quantity", typeof(string));
                tblData.Columns.Add("Prod_Expiry", typeof(string));
                tblData.Columns.Add("Prod_Manf_Date", typeof(string));
                tblData.Columns.Add("Prod_Region", typeof(string));
                tblData.Columns.Add("Prod_Head", typeof(string));
                tblData.Rows.Add("2020-1A", "Horlicks", "5000", "10-Jun-20", "05-Jan-20", "NewYork", "Sharuk");
                tblData.Rows.Add("2020-1B", "VIVA", "2000", "10-Jun-20", "05-Jan-20", "California", "Amit");
                tblData.Rows.Add("2020-1C", "Complan", "30000", "10-Jun-20", "05-Jan-20", "Mexico", "John");
                tblData.Rows.Add("2020-1D", "Bournvita", "10000", "10-Jun-20", "05-Jan-20", "NewJersy", "Rauf");

                return tblData;
          
        }


        public static DataTable RefColumn()
        {
            DataTable dataTable = new DataTable();
            dataTable.Columns.Add("Column_ID", typeof(string));
            dataTable.Columns.Add("Column_Name", typeof(string));
            dataTable.Columns.Add("Excel_column", typeof(string));
            dataTable.Columns.Add("Country_Name", typeof(string));
            dataTable.Columns.Add("Status", typeof(string));
            dataTable.Rows.Add("Prod_ID", "Prod.No", "H", "USA", "Active");
            dataTable.Rows.Add("Prod_Name", "Prod.Name", "A", "USA", "Active");
            dataTable.Rows.Add("Prod_Quantity", "Quantity", "C", "USA", "Active");
            dataTable.Rows.Add("Prod_Expiry", "Expiry Date", "D", "USA", "Active");
            dataTable.Rows.Add("Prod_Manf_Date", "Manufacturing Date", "E", "USA", "Active");
            dataTable.Rows.Add("Prod_Region", "Region", "B", "USA", "Active");
            dataTable.Rows.Add("Prod_Head", "Head of Region", "G", "USA", "Active");
            dataTable.Rows.Add("Prod_ID", "Prod. No", "B", "UK", "Active");
            dataTable.Rows.Add("Prod_Name", "Prod. Name", "A", "UK", "Active");
            dataTable.Rows.Add("Prod_Quantity", "Quantity", "X", "UK", "Active");
            dataTable.Rows.Add("Prod_Expiry", "Expiry Date", "M", "UK", "Active");
            dataTable.Rows.Add("Prod_Manf_Date", "Manufacturing Date", "N", "UK", "Active");
            dataTable.Rows.Add("Prod_Region", "Region", "O", "UK", "Active");
            dataTable.Rows.Add("Prod_Head", "Head of Region", "K", "UK", "Active");
            dataTable.Rows.Add("Prod_ID", "Prod. No", "A", "INDIA", "Active");
            dataTable.Rows.Add("Prod_Name", "Prod. Name", "B", "INDIA", "Active");
            dataTable.Rows.Add("Prod_Quantity", "Quantity", "C", "INDIA", "Active");
            dataTable.Rows.Add("Prod_Expiry", "Expiry Date", "D", "INDIA", "Active");
            dataTable.Rows.Add("Prod_Manf_Date", "Manufacturing Date", "E", "INDIA", "Active");
            dataTable.Rows.Add("Prod_Region", "Region", "F", "INDIA", "Active");
            dataTable.Rows.Add("Prod_Head", "Head of Region", "F", "INDIA", "Active");

            return dataTable;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            comboBox1.Items.Add("USA");
            comboBox1.Items.Add("UK");
            comboBox1.Items.Add("INDIA");
        }
    }
}

Richard MacCutchan

Вы используете переменную index i для индексации по строкам, но также и для выбора определенных столбцов.

Richard MacCutchan

int TotRows = dtMaster.Rows.Count;
TotRows = 12 + TotRows;

Какова цель этих двух строк?

gani7787

int TotRows = dtMaster.Rows.Count; ==> Это будет подсчитывать общее количество строк данных. ==я думаю, что этого не требуется.
TotRows = 12 + TotRows; ==> Я хочу распечатать данные из строки№: 12

Вы также можете удалить вышеупомянутые два шага.

Цель состоит в том, чтобы значения таблицы данных начинались с row.no:12 в соответствующих столбцах....

Richard MacCutchan

Но это не имеет смысла, потому что вы ничего не делаете с этим значением, и почему вам нужно пересчитывать его каждую итерацию цикла?

А вот еще два, которые не нужно пересчитывать каждый раз:

DataView dv = new DataView(dtMaster);
DataTable dt = dv.ToTable(true, dtMaster.Columns[i].ToString());

И вторая строка снова использует переменную rows для доступа к столбцу.

gani7787

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

Richard MacCutchan

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

1 Ответов

Рейтинг:
2

Kraule

Пожалуйста, измените свой код в SaveToExcel:

if (dtMaster.Rows.Count > 0)
            {
                for (int i = 0; i < dtMaster.Rows.Count-1; i++)
                {

                    //************* Struggling to print rows from here ****************
                    DataView dv = new DataView(dtMaster);

                    DataTable dt = dv.ToTable(true, dtMaster.Columns[i].ToString());

                    //Get Column Name
                    string colname = dtMaster.Columns[i].ToString();
                    //Get Reference column 
                    string RefCol = (dtReftable.AsEnumerable().Where(p => p.Field<string>("Country_Name") == country && p.Field<string>("Column_Name") == colname).Select(p => p.Field<string>("Excel_column"))).FirstOrDefault();
                    int TotRows = dtMaster.Rows.Count;
                    TotRows = 12 + TotRows;


                    //To Print : Excel rows Should start to print from Rows 10
                    var tmp = dt.Rows[i][0].ToString();
                    wsht.Cells[10,i+1] = tmp;
                    //************* Struggling to print rows from here ****************

                }
            }


gani7787

Спасибо за вашу помощь...

получение ошибки в строке, как показано ниже

var tmp = dt.Rows[i][0].Метод toString();

Ошибка : необработанное исключение типа 'System.IndexOutOfRangeException' произошло в System.Data.dll

Дополнительная информация: в позиции 3 нет строки.

Ps : могу ли я распечатать все значения столбцов в соответствующем столбце excel..?

pls. см. ниже снимок экрана для вашей справки.

https://1drv.ms/u/s!AiSRcgO5FUmNdcjWYVAuQiC8yuY?e=Y5fbJh

Kraule

Измените предложение foreach на:
for (int i = 0; i < dtMaster.Rows.Граф-1; i++)

gani7787

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