- PR -

CSV ⇒ EXCEL エクセルファイルを確認すると「001」が「1」と表示されます。

投稿者投稿内容
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-11 19:19
引用:

なおこ(・∀・)さんの書き込み (2006-01-11 16:49) より:


正規の方法をひとつのメソッドに実装しようとすると、かなり悲惨ですね。(^^;)

コード:

    private static void OneMethod() {
        Excel.Application xlApplication = null;

        try {
            xlApplication = new Excel.Application();
            xlApplication.SheetsInNewWorkbook = 1;
            Excel.Workbooks xlBooks = null;

            try {
                xlBooks = xlApplication.Workbooks;
                Excel.Workbook xlBook = null;

                try {
                    string stFilePath = System.IO.Path.Combine("D" + System.IO.Path.VolumeSeparatorChar, "MakiMakiLove.csv");
                    xlBook = xlBooks.Add(System.Reflection.Missing.Value);
                    Excel.Sheets xlSheets = null;

                    try {
                        xlSheets = xlBook.Sheets;
                        Excel.Worksheet xlSheet = null;

                        try {
                            xlSheet = (Excel.Worksheet)xlSheets[1];
                            Excel.Range xlCells = null;

                            try {
                                xlCells = xlSheet.Cells;

                                using (System.IO.StreamReader sr = new System.IO.StreamReader(stFilePath, System.Text.Encoding.Default)) {
                                    try {
                                        int iRow = 1;

                                        while (sr.Peek() >= 0) {
                                            string[] stLines = sr.ReadLine().Split(',');
                                            int iColumn = 1;

                                            foreach (string stItem in stLines) {
                                                Excel.Range xlRange = null;
                                                
                                                try {
                                                    xlRange = (Excel.Range)xlCells[iRow, iColumn];
                                                    xlRange.NumberFormatLocal = "@";
                                                    xlRange.Value2 = stItem;
                                                    iColumn++;
                                                } finally {
                                                    if (xlRange != null) {
                                                        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange);
                                                    }
                                                }
                                            }

                                            iRow++;
                                        }
                                    } finally {
                                        if (sr != null) {
                                            sr.Close();
                                        }
                                    }
                                }
                            } finally {
                                if (xlCells != null) {
                                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlCells);
                                }
                            }
                        } finally {
                            if (xlSheet != null) {
                                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet);
                            }
                        }
                    } finally {
                        if (xlSheets != null) {
                            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets);
                        }
                    }

                    xlBook.SaveAs (
                        System.IO.Path.ChangeExtension(stFilePath, "xls"),
                        System.Reflection.Missing.Value, System.Reflection.Missing.Value,
                        System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value,
                        Excel.XlSaveAsAccessMode.xlNoChange, System.Reflection.Missing.Value, System.Reflection.Missing.Value,
                        System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value
                    );
                } finally {
                    if (xlBook != null) {
                        try {
                            xlBook.Close(System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value);
                        } finally {
                            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook);
                        }
                    }
                }
            } finally {
                if (xlBooks != null) {
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks);
                }
            }
        } finally {
            if (xlApplication != null) {
                try {
                    xlApplication.Quit();
                } finally {
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApplication);
                }
            }
      }
    }


疲れました... orz

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2006-01-12 00:23
ねぇねぇ、これって、シート全体を文字列フィールドに変えちゃダメなの?
マクロで記録できると思うんだけど・・・?

もし、局所的なマスだけに影響を及ぼしたいなら、
strTemp2 = int(strTemp)
if ( strTemp != strTemp2) {
  局所的に文字列フィールド
}

こんな処理で何とかなりません?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-12 00:34
引用:

るぱんさんの書き込み (2006-01-12 00:23) より:

ねぇねぇ、これって、シート全体を文字列フィールドに変えちゃダメなの?
マクロで記録できると思うんだけど・・・?


CSV には書式なんて存在しませんよ。
やるならば、Excel Book 形式などにする必要があります。
だからこそ、元質問者さんは変換しようとされたんだと思ってるんですが。

引用:

もし、局所的なマスだけに影響を及ぼしたいなら、
strTemp2 = int(strTemp)
if ( strTemp != strTemp2) {
  局所的に文字列フィールド
}


このコードの意図が判りませんでした...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2006-01-12 01:06
引用:

yamaさんの書き込み (2006-01-11 00:53) より:
◎やりたいこと

  C#でCSVファイルをEXCElファイルに変換したい。
  (OS⇒WindowsS 2003 Server、Excel⇒2000)

●現象
  エクセルファイルを確認すると「001」が「1」と表示されます。

★現コード↓
Excel.Application excel = null;
excel = new Excel.Application();
Excel.Workbook workbook = excel.Workbooks.Add("CSVファイルのパス")
excel.Visible = true;

どなたかご教授頂けないでしょうか。
よろしくお願いいたします。



このソースコードを見る限り、
ExcelWorkBookにCSVを突っ込んでると思うのですが・・・?

CSVファイルをエクセルファイル化してますよね?
って、文意を読み違えてるのかな?
Excelに持ってくるだけなら
Excel側の各セルの書式を変えてやれば良いんじゃないですか?って意味です。

コードは以下の間違いでした。
ごめんなさい。

strTemp2 = str(int(strTemp) )
if ( strTemp != strTemp2) {
  局所的に文字列フィールド
}

int関数とかstr関数がC#に用意されてるかは理解してないのですが、
CSVの一つのValueを評価したらいいと思うのですが?
ダメですかね?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-12 01:47
引用:

るぱんさんの書き込み (2006-01-12 01:06) より:

このソースコードを見る限り、
ExcelWorkBookにCSVを突っ込んでると思うのですが・・・?


はい、そうですね。

引用:

CSVファイルをエクセルファイル化してますよね?


いいえ、していません。
何もしていませんから「化」けることはできません。

引用:

Excelに持ってくるだけなら
Excel側の各セルの書式を変えてやれば良いんじゃないですか?って意味です。


出来るんでしょうか?

Excel.Workbook.Open メソッドは、あくまでも Excel アプリケーションから、
書式なし (メモ帳レベル) のファイルを読み込んでいるだけです。

読み込んだ時点で書式は失われて、"001" は 1 になりますが、どうやって元の "桁数" を復元すれば良いでしょうか?

引用:

コードは以下の間違いでした。
ごめんなさい。

strTemp2 = str(int(strTemp) )
if ( strTemp != strTemp2) {
  局所的に文字列フィールド
}


数値型に置き換えて、再度文字列にすることでカンマを除いているってことでしょうか。
キャスト前の検証の有無に関わらず、キャストというものは高コストです。
String.Replace メソッドで取り除くべきだと思います。

引用:

int関数とかstr関数がC#に用意されてるかは理解してないのですが、


私は VB にはあまり詳しくないのですが、
int と str 関数はキャストとは無関係ではないかと思います。
(リファレンスを見てください、CInt, CStr とは全く別物です)

引用:

CSVの一つのValueを評価したらいいと思うのですが?
ダメですかね?


桁数決め打ちで良いのであれば、Text の形成だけでいけますね。
あとは、FileFormat を Excel Book 形式で保存すれば良いです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2006-01-12 09:14
CSVと言うデータを表示するI/Fにエクセルを使っていると解釈しました。
それをもって、エクセルファイル化した・・・と意識しています。

CSVをそのままつっこむのではなく、
エクセルを開いてから各セルにプロットしてやれば良いでしょう。

エクセルを開いた後、
エクセルのシートに対して全てのセルを「文章」が入るようにセットしてやります。
その上で、CSVのデータを配列に取り込んでから各セルに流し込んでやれば良いと思いますが・・・?

開いた後に.csvと言う拡張子で保存してやれば、いいのではないかなぁ?と。
まぁ、"で括ってやる方が楽ですけどね。

まぁ、その後、CSVを何処かへ持っていくとなると難しいか・・・?

えっと、キャストなんて高等な思想はVBにとっては邪道です。
ただ、ひたすら配列をガリガリ扱うんですよ。(笑)

できるかできないかと言われれば出来なくは無い・・・かな?

strTemp2 = str(int(strTemp) )
上記はJavaで表現すると
String strTemp2 = (Integer.parseInt(strTemp)).toString()
こんな感じです。

コレってキャストですか?
001を見分けたい時にコレで取れませんかね?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-12 09:41
引用:

るぱんさんの書き込み (2006-01-12 09:14) より:

CSVと言うデータを表示するI/Fにエクセルを使っていると解釈しました。
それをもって、エクセルファイル化した・・・と意識しています。


先にも書きましたが、CSV ファイルを Excel アプリケーションで開いているだけです。
少なくとも、エクセルファイルではないでしょう。

引用:

CSVをそのままつっこむのではなく、
エクセルを開いてから各セルにプロットしてやれば良いでしょう。


先にも書きましたが、何桁であるかも不明な状態で "1" を "001" に復元はできないでしょう。

引用:

エクセルを開いた後、
エクセルのシートに対して全てのセルを「文章」が入るようにセットしてやります。
その上で、CSVのデータを配列に取り込んでから各セルに流し込んでやれば良いと思いますが・・・?


ロジックに関しては具体的に仰ってください。
この文章をも、私は誤解してそうな気がします。

"何を" Excel で開いた後ですか?
各セルへの再セットは、すでになおこさんも私も実装例をあげています。

CSV ファイルを Excel アプリケーションから開くと "001" は "1" と見なされます。
Cell の参照でかなり処理速度も落ちますし、さらにムダに COM オブジェクトを扱うのは避けたいという事実があります。

引用:

開いた後に.csvと言う拡張子で保存してやれば、いいのではないかなぁ?と。
まぁ、"で括ってやる方が楽ですけどね。


すいません、意味が判りませんでした。
CSV ファイルを開いた後に、.csv という拡張子で保存しても何も変わらないと思いますが...

引用:

まぁ、その後、CSVを何処かへ持っていくとなると難しいか・・・?


?????
元ファイルを削除する必要はないと思います。
普通に Extension が変わってしまいますからね。
(でないと、別のアプリケーションで正しく扱えない)

引用:

えっと、キャストなんて高等な思想はVBにとっては邪道です。


キャストは「高等な思想」ではないでしょう。
また、VB だからダメという根拠が判りません。
キャストを避けるべきなのはどの言語でも変わりません。

引用:

ただ、ひたすら配列をガリガリ扱うんですよ。(笑)


るぱんさんの仰ることが、判らないことが多々あります。
キーワードを並べただけでは、私には理解できません。
できれば、具体例をあげてください。

引用:

できるかできないかと言われれば出来なくは無い・・・かな?
(snip)
コレってキャストですか?
001を見分けたい時にコレで取れませんかね?


繰り返しに近いですが、parseInt メソッドが成功する保証は?
先ほども申し上げたように String.Replace メソッドを使うべきです。
できるできないを私は問題にしていません。

# VB の Int 関数が parseInt メソッドの代わりだとも思っていません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-01-12 09:42
引用:

  C#でCSVファイルをEXCElファイルに変換したい。



ってことなんで、最終成果物として欲しいのは「Excel ワークシート」なんでしょう。

てことなら、Excel で CSV ファイルを開いた後にセルの書式設定をしてやって、Save の時に保存形式を明示的に指定してやればいいんじゃないすか?

スキルアップ/キャリアアップ(JOB@IT)