.NET 3.x Нужны компоненты для конвертации .xls в .xml и обратно - Visual Basic .NET

Узнай цену своей работы

Формулировка задачи:

Доброго! не могу найти компоненты для конвертации .xls в .xml и обратно. смотрел NPOI(так и не нашел решения) , GemBox.Spreadsheet (бесплатная версия не поддерживает формат xml) .xml - удобный формат для редактирования без установленного excel.
нашел это -https://code.msdn.microsoft.com/offi...-file-7a9bb404 ошибка - для 2007 и 2003 - файл поврежден
нет не каких идей ? как конвертировать автоматически без установленного excel ?

Решение задачи: «.NET 3.x Нужны компоненты для конвертации .xls в .xml и обратно»

textual
Листинг программы
  1. Imports System.Xml
  2. Imports System.IO
  3. Imports System.Text
  4. Imports System.IO.Compression
  5. Imports Shell32
  6.  
  7.  
  8. Public Class Form1
  9.     Dim fold As String = My.Computer.FileSystem.SpecialDirectories.Temp & "\tmp_excel"
  10.  
  11.     Dim filexcel As String = "C:\test\Книга22.xlsx"
  12.     Dim tmp_filexcel As String = Path.ChangeExtension(Me.filexcel, ".zip")
  13.  
  14.     Dim xr As XmlReader
  15.     Dim xrw As XmlTextReader
  16.  
  17.     Dim ch_n(,) As String ' (имя,тип,позиция)
  18.     Dim ch_v() 'значения ячеек в случае s
  19.     Dim i As Integer
  20.  
  21.     Dim numcv, numcn As Integer ' позиции значений
  22.  
  23.     Dim shObj As New Shell32.Shell()
  24.  
  25.     'кнопка распокавать
  26.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  27.         If Directory.Exists(fold) Then
  28.             Directory.Delete(fold, True)
  29.         End If
  30.         Directory.CreateDirectory(fold)
  31.  
  32.         If File.Exists(Me.filexcel) Then
  33.             IO.File.Move(filexcel, tmp_filexcel)
  34.         End If
  35.  
  36.         Dim output As Shell32.Folder = shObj.NameSpace(fold)
  37.         Dim input As Shell32.Folder = shObj.NameSpace(tmp_filexcel)
  38.        
  39.         If File.Exists(tmp_filexcel) Then
  40.             output.CopyHere((input.Items), 16)
  41.             MsgBox("done")
  42.         Else
  43.             MsgBox("файл не найден")
  44.         End If
  45.     End Sub
  46.  
  47.     ''кнопка упаковать
  48.     Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
  49.  
  50.         If File.Exists(tmp_filexcel) Then
  51.             File.Delete(tmp_filexcel)
  52.         End If
  53.  
  54.         Dim ZipHeader As Byte() = New Byte() {80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
  55.         Dim fs As FileStream = File.Create(tmp_filexcel)
  56.         fs.Write(ZipHeader, 0, ZipHeader.Length)
  57.         fs.Flush()
  58.         fs.Close()
  59.         fs = Nothing
  60.         Dim sh As New Shell32.Shell()
  61.         Dim input As Shell32.Folder = sh.NameSpace(fold)
  62.         Dim output As Shell32.Folder = sh.NameSpace(tmp_filexcel)
  63.         output.CopyHere(input.Items, 16)
  64.         File.Move(tmp_filexcel, filexcel)
  65.     End Sub
  66.     'кнопка значение ячейки
  67.     Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
  68.         xr = XmlReader.Create(fold & "\xl\worksheets\sheet1.xml")
  69.         i = 0
  70.         Dim tmp_n() As String
  71.  
  72.         Do While xr.Read()
  73.             ReDim Preserve tmp_n(i)
  74.             ReDim Preserve ch_n(2, i)
  75.             If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "c" Then
  76.  
  77.                 ch_n(0, i) = xr.GetAttribute("r") 'имена
  78.                 'xr.GetAttribute(0).ToString  
  79.                 tmp_n(i) = ch_n(0, i)
  80.                 Try
  81.                     ch_n(1, i) = xr.GetAttribute("t")  'типы значений
  82.                 Catch ex As Exception
  83.                     ch_n(1, i) = "i"
  84.                 End Try
  85.                 ch_n(2, i) = xr.ReadElementString ' расположение в случае "s"
  86.                 i += 1
  87.             End If
  88.         Loop
  89.  
  90.         numcn = Array.IndexOf(tmp_n, TextBox2.Text)
  91.         xr.Close()
  92.         Erase tmp_n
  93.  
  94.         If numcn <> -1 Then
  95.             xr = XmlReader.Create(fold & "\xl\sharedStrings.xml")
  96.             i = 0
  97.             Do While xr.Read()
  98.                 If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "t" Then
  99.                     ReDim Preserve ch_v(i)
  100.                     ch_v(i) = xr.ReadElementString
  101.                     i += 1
  102.                 End If
  103.             Loop
  104.  
  105.             If ch_n(1, numcn) = "s" Then
  106.                 TextBox1.Text = ch_v(Convert.ToInt32(ch_n(2, numcn)))
  107.             Else
  108.                 TextBox1.Text = ch_n(2, numcn)
  109.             End If
  110.             xr.Close()
  111.         Else
  112.             TextBox1.Text = "не найдено"
  113.         End If
  114.         ''Erase ch_n
  115.     End Sub
  116.     Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
  117.  
  118.     End Sub
  119.     'кнопка заменить значение
  120.     Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click
  121.         If CheckBox1.Checked = True Then
  122.             writeh(TextBox4.Text, "integer")
  123.         Else
  124.             writeh(TextBox4.Text, "string")
  125.         End If
  126.     End Sub
  127.     Private Function writeh(strock As String, t As String) As String
  128.         xrw = New XmlTextReader(fold & "\xl\sharedStrings.xml")
  129.         Dim doc As New XmlDocument()
  130.         doc.Load(xrw)
  131.         xrw.Close()
  132.  
  133.         xrw = New XmlTextReader(fold & "\xl\worksheets\sheet1.xml")
  134.         Dim doc1 As New XmlDocument()
  135.         doc1.Load(xrw)
  136.         xrw.Close()
  137.  
  138.         Dim oldCd As XmlNode
  139.         Dim root As XmlElement
  140.         Dim nsmgr As XmlNamespaceManager
  141.         Dim elemList As XmlNodeList
  142.  
  143.         If ch_n(1, numcn) = "s" Then
  144.             If t = "string" Then
  145.  
  146.                 root = doc.DocumentElement
  147.  
  148.                 nsmgr = New XmlNamespaceManager(doc.NameTable)
  149.                 nsmgr.AddNamespace("ss", "http://schemas.openxmlformats.org/spreadsheetml/2006/main")
  150.  
  151.                 oldCd = root.SelectSingleNode("/ss:sst/ss:si[" & (Convert.ToInt32(ch_n(2, numcn)) + 1).ToString & "]", nsmgr) '/ss:sst/
  152.                 Dim newCd As XmlElement = doc.CreateElement("si", "http://schemas.openxmlformats.org/spreadsheetml/2006/main")
  153.                 Dim value = newCd.AppendChild(doc.CreateElement("t", "http://schemas.openxmlformats.org/spreadsheetml/2006/main"))
  154.                 value.AppendChild(doc.CreateTextNode(strock))
  155.  
  156.                 'root.InsertAfter(newCd, newCd)    TextBox4
  157.                 root.ReplaceChild(newCd, oldCd)
  158.                 doc.Save(fold & "\xl\sharedStrings.xml")
  159.  
  160.                 writeh = "done"
  161.                 MsgBox(writeh)
  162.             Else
  163.                 'удалить узел в sharedStrings.xml
  164.                 root = doc.DocumentElement
  165.  
  166.                 nsmgr = New XmlNamespaceManager(doc.NameTable)
  167.                 nsmgr.AddNamespace("ss", "http://schemas.openxmlformats.org/spreadsheetml/2006/main")
  168.  
  169.                 oldCd = root.SelectSingleNode("/ss:sst/ss:si[" & (Convert.ToInt32(ch_n(2, numcn)) + 1).ToString & "]", nsmgr)
  170.                 root.RemoveChild(oldCd)
  171.                 doc.Save(fold & "\xl\sharedStrings.xml")
  172.                 'заменить значение в sheet1.xml
  173.                 root = doc1.DocumentElement
  174.  
  175.                 nsmgr = New XmlNamespaceManager(doc1.NameTable)
  176.                 nsmgr.AddNamespace("s1", "http://schemas.openxmlformats.org/officeDocument/2006/relationships")
  177.                 nsmgr.AddNamespace("s2", "http://schemas.openxmlformats.org/spreadsheetml/2006/main")
  178.  
  179.                 'numcn
  180.                 oldCd = root.SelectSingleNode("//s2:c[" & (numcn + 1).ToString & "]", nsmgr)
  181.  
  182.                 Dim newCd As XmlElement = doc1.CreateElement("c", "http://schemas.openxmlformats.org/spreadsheetml/2006/main")
  183.                 newCd.SetAttribute("r", ch_n(0, numcn))
  184.                 'newCd.SetAttribute("t", "s")
  185.  
  186.                 Dim value = newCd.AppendChild(doc1.CreateElement("v", "http://schemas.openxmlformats.org/spreadsheetml/2006/main"))
  187.                 value.AppendChild(doc1.CreateTextNode(TextBox4.Text))
  188.  
  189.                 oldCd.ParentNode.ReplaceChild(newCd, oldCd)
  190.  
  191.                 doc1.Save(fold & "\xl\worksheets\sheet1.xml")
  192.  
  193.                 writeh = "done"
  194.                 MsgBox(writeh)
  195.             End If
  196.         Else
  197.             If t = "string" Then
  198.                 ' добавить узел с значением в sharedStrings.xml
  199.                 root = doc.DocumentElement
  200.  
  201.                 elemList = root.GetElementsByTagName("c")
  202.                 Dim numstr As Integer = elemList.Count + 1
  203.  
  204.                 nsmgr = New XmlNamespaceManager(doc.NameTable)
  205.                 nsmgr.AddNamespace("ss", "http://schemas.openxmlformats.org/spreadsheetml/2006/main")
  206.  
  207.                 Dim newCd As XmlElement = doc.CreateElement("si", "http://schemas.openxmlformats.org/spreadsheetml/2006/main")
  208.                 Dim value = newCd.AppendChild(doc.CreateElement("t", "http://schemas.openxmlformats.org/spreadsheetml/2006/main"))
  209.                 value.AppendChild(doc.CreateTextNode(TextBox4.Text))
  210.                 root.AppendChild(newCd)
  211.  
  212.                 doc.Save(fold & "\xl\sharedStrings.xml")
  213.                 ' заменить значение на порядковый номер
  214.                 root = doc1.DocumentElement
  215.  
  216.                 nsmgr = New XmlNamespaceManager(doc1.NameTable)
  217.                 nsmgr.AddNamespace("s1", "http://schemas.openxmlformats.org/officeDocument/2006/relationships")
  218.                 nsmgr.AddNamespace("s2", "http://schemas.openxmlformats.org/spreadsheetml/2006/main")
  219.  
  220.                 oldCd = root.SelectSingleNode("//s2:c[" & (numcn + 1).ToString & "]", nsmgr)
  221.  
  222.                 Dim newCd2 As XmlElement = doc1.CreateElement("c", "http://schemas.openxmlformats.org/spreadsheetml/2006/main")
  223.                 newCd2.SetAttribute("r", ch_n(0, numcn))
  224.                 newCd2.SetAttribute("t", "s")
  225.  
  226.                 Dim value2 = newCd2.AppendChild(doc1.CreateElement("v", "http://schemas.openxmlformats.org/spreadsheetml/2006/main"))
  227.                 value2.AppendChild(doc1.CreateTextNode(numstr.ToString))
  228.  
  229.                 oldCd.ParentNode.ReplaceChild(newCd2, oldCd)
  230.  
  231.                 doc1.Save(fold & "\xl\worksheets\sheet1.xml")
  232.                 writeh = "done"
  233.                 MsgBox(writeh)
  234.             Else
  235.  
  236.  
  237.                 root = doc1.DocumentElement
  238.  
  239.                 nsmgr = New XmlNamespaceManager(doc1.NameTable)
  240.                 nsmgr.AddNamespace("s1", "http://schemas.openxmlformats.org/officeDocument/2006/relationships")
  241.                 nsmgr.AddNamespace("s2", "http://schemas.openxmlformats.org/spreadsheetml/2006/main")
  242.  
  243.                 'numcn
  244.                 oldCd = root.SelectSingleNode("//s2:c[" & (numcn + 1).ToString & "]", nsmgr)
  245.  
  246.                 Dim newCd As XmlElement = doc1.CreateElement("c", "http://schemas.openxmlformats.org/spreadsheetml/2006/main")
  247.                 newCd.SetAttribute("r", ch_n(0, numcn))
  248.                 'newCd.SetAttribute("t", "s")
  249.  
  250.                 Dim value = newCd.AppendChild(doc1.CreateElement("v", "http://schemas.openxmlformats.org/spreadsheetml/2006/main"))
  251.                 value.AppendChild(doc1.CreateTextNode(TextBox4.Text))
  252.  
  253.                 oldCd.ParentNode.ReplaceChild(newCd, oldCd)
  254.  
  255.                 doc1.Save(fold & "\xl\worksheets\sheet1.xml")
  256.  
  257.                 writeh = "done"
  258.                 MsgBox(writeh)
  259.             End If
  260.         End If
  261.     End Function
  262.  
  263.  
  264.     'кнопка объеденена
  265.     Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
  266.  
  267.         Dim tmp_ch_sn() As String
  268.         Dim tmp_ch_vn() As String
  269.  
  270.         Dim info As String = "не найдено"
  271.         i = 0
  272.         xr = XmlReader.Create(fold & "\xl\worksheets\sheet1.xml")
  273.  
  274.         Do While xr.Read()
  275.             ReDim Preserve tmp_ch_sn(i)
  276.             ReDim Preserve tmp_ch_vn(i)
  277.             Try
  278.                 If xr.NodeType = XmlNodeType.Element AndAlso xr.Name = "mergeCell" Then
  279.                     tmp_ch_sn(i) = xr.GetAttribute("ref")
  280.                     tmp_ch_vn(i) = xr.GetAttribute("ref").Split(":")(0)
  281.                     i += 1
  282.                     numcv = Array.IndexOf(tmp_ch_vn, TextBox2.Text)
  283.                     If numcv <> -1 Then
  284.                         info = tmp_ch_sn(numcn)
  285.                     End If
  286.                 End If
  287.             Catch ex As Exception
  288.  
  289.             End Try
  290.             TextBox3.Text = info
  291.         Loop
  292.     End Sub
  293.    
  294.     Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
  295.  
  296.     End Sub
  297. End Class

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.077 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы