1

カスタム区切り文字を除いて、.CSV に似た独自のカスタム ファイル タイプがあります。コンマの区切り文字は(char)20(四角形のように見えます) で、引用符の区切り文字は(char)254(þのように見えます) です。Visual Studio で Excel 2010 アドインを作成し、.CSV 形式になるようにすべてのカスタム区切り記号をコンマと二重引用符に置き換えるドキュメントを解析しました。

プログラムは、プロセスを開始する新しいツールバーとボタンも作成します。一部のドキュメントでは正常に機能しますが、他のドキュメントでは機能しません。Excel の 1 つのインスタンスで 2 回実行しようとすると、エラーが発生します"Cannot implicitly convert type 'System.DBNull' to 'string'"。これは、row.Textプロパティが として読み取られているため{}です。

今私の質問は、プロパティがセル内のテキストではなくrow.Text読み取られる原因は何ですか? {}また、同じエンコーディングを使用しているにもかかわらず、一部のドキュメントでこれが発生し、他のドキュメントでは発生しないのはなぜですか?

セルの内容の例は次のとおりです (注 - コンマ記号はここでは印刷されません)。

þITEM_IDþþBEGDOCþþENDDOCþþBEGATTþþENDATTþþPARENT_ATTACHMENTþþATTACHMENT_BATESþþ etc.

編集ここに私のコードがあります:

    public partial class ThisAddIn
{
    Office.CommandBarButton toolbarCommand;

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        Office.CommandBar toolbar = Application.CommandBars.Add("My Toolbar",Office.MsoBarPosition.msoBarTop,false,true);
        toolbarCommand = (Office.CommandBarButton)
        toolbar.Controls.Add(
           Office.MsoControlType.msoControlButton,
           missing,
           missing,
           missing,
           true);
        toolbarCommand.Caption = "Toolbar Button";
        toolbarCommand.FaceId = 59;
        toolbarCommand.Click += new Office._CommandBarButtonEvents_ClickEventHandler(toolbarCommand_Click);
        toolbar.Visible = true;
    }



    void toolbarCommand_Click(Office.CommandBarButton Ctrl, ref bool CancelDefault)
    {
        Excel.Worksheet activeWorksheet = ((Excel.Worksheet)Application.ActiveSheet);
        try
        {
            IterateRows(activeWorksheet);
        }
        catch(Exception e)
        {
            MessageBox.Show(e.ToString());
        }
        Ctrl.Click+=new Office._CommandBarButtonEvents_ClickEventHandler(toolbarCommand_Click);
    }

    public void IterateRows(Excel.Worksheet worksheet)
    {
        //Get the used Range
        Excel.Range usedRange = worksheet.UsedRange;

        Excel.Worksheet activeWorksheet = ((Excel.Worksheet)Application.ActiveSheet);

        //Iterate the rows in the used range

        if (usedRange.Rows.Count > 1)
        {
            foreach (Excel.Range row in usedRange.Rows)
            {
                //MessageBox.Show(row.Text);
                char quote = (char)254;
                string data = row.Text;
                row.Columns[1] = data.Replace(quote, '"').Replace((char)20, ',');
                row.TextToColumns(Type.Missing, Excel.XlTextParsingType.xlDelimited, Excel.XlTextQualifier.xlTextQualifierDoubleQuote, Type.Missing, Type.Missing, Type.Missing, true);
            }
        }
    }
4

0 に答える 0