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