.NET Framework 3.5.1 と 4.6.2 でVSTOの動作が違う

エクセルにデータを貼り付けるアプリをC#で作っているのだけど、.NET Frameworkのバージョンの違いで動作が違うことに気がついたので、記録しておきます。


アプリを使っているお客さんから、「01-6413」が「1648342」と変な値でコピーされると問い合わせがあった。つまり、ハイフォン「-」を含む数字をエクセルにコピーすると化ける。

しかしアプリは何も変えていなくて、ターゲットフレームワークを .NET Framework 3.5.1 から 4.6.2 に変えたことくらい。さすがに3.5は古いだろうと云うことで変えたのだ。

テストアプリを作って試してみたところ、.NET Framework 3.5.1用にビルドしたアプリと、4.6.2用にビルドしたアプリで動作が違うことがわかった。

(例)「01-6413」をB1セルにコピーしたとき
  • .NET Framework 3.5.1用にビルドしたアプリ 「01-6413」がコピーされる
  • .NET Framework 4.6.2用にビルドしたアプリ 「6413/1/1」がコピーされる

なに、これ?

「-」付きのデータを見て思い出されるのは、エクセルが勝手に日付に変換してしまう機能(たとえば「7-20」と入力すると「7/20」にされてしまう)だけど、さすがに「01-6413」を6413/1/1に変換するのはおかしくないかい?

エクセルを開いて「01-6413」と手入力したら、そのまま入力されたので、アプリ側でデータを変換して、エクセルにコピーしているのだろうか。VSTOのバグなのか?.NET Framework 4.6.2と組み合わせるとおかしくなる?

どちらにせよ、困ったものだ。



テストアプリのエクセルにコピーするコード。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using sysExcel = Microsoft.Office.Interop.Excel;

namespace copyDll
{
    public class ExcelTest
    {
        public void doTest()
        {
            sysExcel.Application xlsApp; // Excelオブジェクト

            xlsApp = new sysExcel.Application();
            xlsApp.Visible = true;

            sysExcel.Workbook wb = xlsApp.Workbooks.Add(Type.Missing);
            sysExcel.Worksheet ws = (sysExcel.Worksheet)wb.Worksheets[1];

            {
                sysExcel.Range ra;

                ra = ws.Range["A1"];
                ra.Value2 = System.Environment.Version.ToString();

                ra = ws.Range["B1"];
                ra.Value2 = "01-6413";

                ra = ws.Range["C1"];
                ra.Value = "01-5598";
            }
        }
    }
}

これは、書式を設定するくらいしか、回避方法はないのかしら。

解決策

試しにセルの書式を文字列に設定してみると、日付値に変わるのは回避できた。しかし、面倒だなあ。

                ra = ws.Range["B1"];
                ra.NumberFormat = "@";  // 書式を「文字列」
                ra.Value2 =  "01-6413";
                v = ra.Value2;

コメント

このブログの人気の投稿

varchar をデータ型 numeric に変換中に、算術オーバーフロー エラーが発生しました。