paul_vin Ответов: 0

У меня есть один 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-файл не очень хорошо сформирован!

0 Ответов