У меня есть один XML файл я хочу прочитать этот XML с помощью vsto а затем найти записанный в нем и обновить в excel
У меня есть три файла 1 XML и 2 Excel
кулаком в формате Excel (файлы сопоставления в которых содержатся некоторые сведения и линии следующим образом)
-------------------------------------- TagName Excel row -------------------------------------- ShareCapital 418 ReservesAndSurplus 423 ShareholdersFunds 5000 --------------------------------------
2-й (xml-файл, содержащий следующие данные)
<?xml version="1.0" encoding="UTF-8"?> <in-gaap:ShareCapital id="TAG70" contextRef="I2015" unitRef="INR" decimals="-3">1240954000</in-gaap:ShareCapital> <in-gaap:ReservesAndSurplus id="TAG71" contextRef="I2016" unitRef="INR" decimals="-3">8337184000</in-gaap:ReservesAndSurplus> <in-gaap:ReservesAndSurplus id="TAG72" contextRef="I2015" unitRef="INR" decimals="-3">6633045000</in-gaap:ReservesAndSurplus> <in-gaap:ShareholdersFunds id="TAG73" contextRef="I2016" unitRef="INR" decimals="-3">9578138000</in-gaap:ShareholdersFunds> <in-gaap:ShareholdersFunds id="TAG74" contextRef="I2015" unitRef="INR" decimals="-3">7873999000</in-gaap:ShareholdersFunds>
Третий файл excel, который имеет следующую структуру этот файл должен быть открыт, когда я запускаю свой проект надстроек excel
1 "31-Mar-2016 "31-Mar-2015 "31-Mar-2014 2 Input - Profit and Loss Account 0.00 0.00 0.00 3 Revenue from Operations 0.00 0.00 0.00 4 (Less): Inter departmental Sale 0.00 0.00 0.00
и так далее.
Я хочу прочитать этот xml построчно, а затем сравнить его с записями файлов сопоставления (word i.e
ShareCapital
, ReservesAndSurplus
и т. д.), Если строки содержат записи всех тегов и их значений, а также значения XML 1240954000) и обновить/вставить значения во 2-й файлы Excel (против линии приведены в сопоставление файла в файл сопоставления 'акционерный капитал' на 418 линии поэтому я хочу, чтобы вставить его в файл 2-й в 418 линии также, как это было года в XML-файлы тега я.е I2015 так в 2-й файл Excel я хочу, чтобы вставить его на линии № 418 и год столбцов 2015 если ячейка пуста, если ячейка содержит уже тогда значения этого значения на Предыдущее значение и обновить новыми значениями в Excel этот процесс происходит до конца чтения xml
для этого я создал надстройки visual studio excel (ExcelAddIn1), в которые я добавил пользовательский элемент управления (UserControl1), на который я добавил имя элемента управления button как (btnGetExcl)
Что я уже пробовал:
Код ThisAddIn.cs выглядит следующим образом
namespace ExcelAddIn1 { public partial class ThisAddIn { private Microsoft.Office.Tools.CustomTaskPane customPane; private void ThisAddIn_Startup(object sender, System.EventArgs e) { // I open excel file when project is run i.e CorporateTemplate in whic data has to update/insert this.Application.Workbooks.Open(@"C:\Users\user1\Desktop\Vinayak\Finolex\CorporateTemp late.xlsx"); ShowShanuControl(); } public void ShowShanuControl() { var txtObject = new UserControl1(); customPane = this.CustomTaskPanes.Add(txtObject, "Enter Text"); customPane.Width = txtObject.Width; customPane.Visible = true; } private void ThisAddIn_Shutdown(object sender, System.EventArgs e) { } #region VSTO generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InternalStartup() { this.Startup += new System.EventHandler(ThisAddIn_Startup); this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown); } #endregion } } UserControl1.cs code is as follows <pre lang="c#"> using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Microsoft.Office.Interop.Excel; using Excel = Microsoft.Office.Interop.Excel; using System.Xml; using System.Xml.Linq; using System.IO; using System.Web; namespace ExcelAddIn1 { public partial class UserControl1 : UserControl { public UserControl1() { InitializeComponent(); } static bool addToFile = false; static List<List<string>> imageData = new List<List<string>>(); // code to read mapping xml files and stored its values in list public List<MappingDetail> ReadExcel() { List<MappingDetail> li = new List<MappingDetail>(); string Path = @"D:\Mapping.xlsx"; // initialize the Excel Application class Excel.ApplicationClass app = new ApplicationClass(); // create the workbook object by opening the excel file. Excel.Workbook workBook = app.Workbooks.Open(Path, 0, true, 5, "", "", true, Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); // get the active worksheet using sheet name or active sheet Excel.Worksheet workSheet = (Excel.Worksheet)workBook.ActiveSheet; int index = 0; // This row,column index should be changed as per your need. // i.e. which cell in the excel you are interesting to read. object rowIndex = 2; object colIndex1 = 1; object colIndex2 = 2; try { while (((Excel.Range)workSheet.Cells[rowIndex, colIndex1]).Value2 != null) { MappingDetail objMappingDetails = new MappingDetail(); rowIndex = 2 + index; objMappingDetails.TagName = ((Excel.Range)workSheet.Cells[rowIndex, colIndex1]).Value2.ToString(); objMappingDetails.Excelrow = Convert.ToInt32(((Excel.Range)workSheet.Cells[rowIndex, colIndex2]).Value2.ToString()); index++; li.Add(objMappingDetails); if (li.Count == 25) break; } } catch (Exception ex) { app.Quit(); Console.WriteLine(ex.Message); } return li; } private void btnGetExcl_Click(object sender, EventArgs e) { List<string> tempData = new List<string>(); List<string> tempData1 = new List<string>(); // calling function which stored mapping excel values into list and return list List<MappingDetail> list = ReadExcel(); List<string> year = new List<string>(); List<decimal> Value = new List<decimal>(); // here i am reading xml file present in document folder XmlTextReader reader = new XmlTextReader("Product.xml"); while (reader.Read()) { string str = reader.Name.ToString(); string str1 = reader.Value.ToString(); foreach (var iteam in list) { int lineno = iteam.Excelrow; string sss1 = iteam.TagName.ToString(); if (str.Contains(sss1) || str1.Contains(sss1)) { while (reader.MoveToNextAttribute()) { //Console.Write(xmlReader.Name); //Console.Write(xmlReader.Value + " "); tempData1.Add(reader.Name); // here I am getting all tag in this list tempData.Add(reader.Value); // here I am getting all tag values in this list but I am not getting actual values i.e in xml fist lines values '1240954000' in first iteration of loop while in second iteration I am not getting tag and tag values // so here how can I get all values of tag 'id="TAG70" contextRef="I2015" unitRef="INR" decimals="-3"' and actual values '1240954000' in same time(in one iteration of loop) } string mystring = tempData[2].ToString(); string abc = mystring.Substring(1); // here I am taking year in one variables also I have line no in int lineno = iteam.Excelrow; so now I want to insert values '1240954000' in year and line no cell in 2nd excel so how can I do It //Excel.Worksheet activeSheet = ((Excel.Worksheet)(application.ActiveSheet)); Excel.Worksheet activeSheet = ((Excel.Worksheet)(Excel.Application.ActiveSheet)); // here giving error object reference is required for non-static field,Method or property '_Application.ActiveSheet' //Excel.Worksheet activeWorksheet = ((Excel.Worksheet)obj.ActiveSheet); } } } } public class MappingDetail { public string TagName { get; set; } public int Excelrow { get; set; } } } }
#realJSOP
Блин, чувак, обрати внимание на свое форматирование. (Я уже почти все исправил.)
Maciej Los
Ваш xml-файл не очень хорошо сформирован!