none
OpenXml.SpreadsheetでCell値を取得した時、フリガナも表示される RRS feed

  • 質問

  • はじめでの投稿です。何卒宜しくお願い申上げます。

    OPENXMLでEXCELの特定せるから値を取得したいが、表示されている漢字以外に、フリガナも自動追加されてしまいます。セルに表示された値だけを取得できませんか?

    例えば、テストファイルのA4セルには、「定期作業」だけ入っているのに、取得した値は「定期作業テイキサギョウ」となってしまいます。大変困っており、ヒントを頂ければ幸いです。

    Imports DocumentFormat.OpenXml

    Imports DocumentFormat.OpenXml.Packaging

    Imports DocumentFormat.OpenXml.Spreadsheet
    Imports DocumentFormat.OpenXml.Drawing.Spreadsheet

    Protected Sub btnGetValue_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnGetValue.Click
            lblMsg.Text = ""
            Dim mFilePath As String = "C:\inetpub\wwwroot\nas\Reports\SampleDocs\" & "abc" & ".xlsx"
            lblMsg.Text = GetCellValueWithwsIndex(mFilePath, 0, "A", 4)
          
        End Sub

        Public Function GetCellValueWithwsIndex(ByVal mFilePath As String, ByVal wsIndex As Integer, ByVal columnName As String, ByVal rowIndex As UInteger) As String
            Dim value As String = String.Empty
            Using document As SpreadsheetDocument = SpreadsheetDocument.Open(mFilePath, False)
                Dim stringTablePart As SharedStringTablePart = document.WorkbookPart.SharedStringTablePart
                
                Dim wbPart As WorkbookPart = document.WorkbookPart
                Dim thisWorkSheet As Worksheet = myUtility.GetWorkSheet(wbPart, "ByIndex", wsIndex)
                Dim thisCell As Cell = myUtility.GetCellToSet(thisWorkSheet, columnName, rowIndex)
                If thisCell.CellValue IsNot Nothing Then
                    value = thisCell.CellValue.InnerXml
                    If thisCell.DataType IsNot Nothing AndAlso thisCell.DataType.Value = CellValues.SharedString Then
                        value = stringTablePart.SharedStringTable.ChildElements(Int32.Parse(value)).InnerText
                    End If
                End If
            End Using
            Return value
        End Function

    2014年2月21日 3:07

回答

  • stringTablePart.SharedStringTable.ChildElements(Int32.Parse(value))のOuterXmlを表示させてみると分かりますが、読みのデータも含んだそれなりに大きな構造になっています。

    String Itemの仕様は次のページで紹介されています。

    http://msdn.microsoft.com/en-us/library/office/gg278314.aspx

    結論から言うと、String Itemの直接の子要素の内、ローカル名がtである要素のInnerTextが目的とする値になります。

    プログラム的には、stringTablePart.SharedStringTable.ChildElements(Int32.Parse(value))が返すオブジェクトをSharedStringItemにキャストして、そのText(.Textですね。SharedStringItem::TextはTextオブジェクトを返し、Text::TextがStringを返します)が目的の値です。

    • 回答としてマーク 星 睦美 2014年2月24日 1:30
    2014年2月21日 4:21

すべての返信

  • stringTablePart.SharedStringTable.ChildElements(Int32.Parse(value))のOuterXmlを表示させてみると分かりますが、読みのデータも含んだそれなりに大きな構造になっています。

    String Itemの仕様は次のページで紹介されています。

    http://msdn.microsoft.com/en-us/library/office/gg278314.aspx

    結論から言うと、String Itemの直接の子要素の内、ローカル名がtである要素のInnerTextが目的とする値になります。

    プログラム的には、stringTablePart.SharedStringTable.ChildElements(Int32.Parse(value))が返すオブジェクトをSharedStringItemにキャストして、そのText(.Textですね。SharedStringItem::TextはTextオブジェクトを返し、Text::TextがStringを返します)が目的の値です。

    • 回答としてマーク 星 睦美 2014年2月24日 1:30
    2014年2月21日 4:21
  • 大変助かりました。どうもありがとうございました。

    2014年2月21日 12:53