2017年8月17日木曜日

Excel to CSV C#で作成


NPOIでExcel2003形式に対応
第1パラメータでExcelファイルを指定
第2パラメータでCSV出力ファオルを指定
第3パラメータでヘッダ行として行読み飛ばし

Excelが日付を数値で格納しているので、スタイルから日付を判別する。
日付だけしか扱わないお約束で、日付スタイルは yyyy/MM/dd にしている。

※日付表示は国によって違うので要注意です。




        static void Main(string[] args) {

            //入力ファイル確認
            try {
                if (!File.Exists(args[0])) {
                    return;
                }
            }
            catch {
                return;
            }

            //Shift JISで書き込む
            //書き込むファイルが既に存在している場合は、上書きする
            using (StreamWriter sw = new StreamWriter(
                    args[1],
                    false,
                    System.Text.Encoding.GetEncoding("shift_jis"))) {

                // (WorkbookFactory.Create()を使ってinterfaceで受け取れば、xls, xlsxの両方に対応できます)
                IWorkbook workbook = WorkbookFactory.Create(args[0]);
                ISheet worksheet = workbook.GetSheetAt(0);

                int lastRow = worksheet.LastRowNum;
                string vLine = "";
                int vY = 0;

                try { vY = Convert.ToInt32(args[2]); } catch { vY = 0; }

                for (int y = vY; y <= lastRow; y++) {
                    IRow row = worksheet.GetRow(y);

                    int maxCell = row.LastCellNum;

                    for (int x = 0; x < maxCell; x++) {

                        if (x == 0) {
                            if (row.Cells[x] != null) {

                                // 数値型
                                if (row.Cells[x].CellType == CellType.Numeric) {

                                    // 日付型として値を取得
                                    if (DateUtil.IsCellDateFormatted(row.Cells[x])) {

                                        vLine = row.Cells[x].DateCellValue.ToString("yyyy/MM/dd");
                                    }
                                    else {
                                        vLine = row.Cells[x].NumericCellValue.ToString();
                                    }
                                }

                                vLine = row.Cells[x].ToString();
                            }
                        }
                        else {
                            if (row.Cells[x] == null) {
                                vLine = vLine.Trim() + ", ";
                            }
                            else {

                                // 数値型
                                if (row.Cells[x].CellType == CellType.Numeric) {

                                    // 日付型として値を取得
                                    if (DateUtil.IsCellDateFormatted(row.Cells[x])) {
                                        vLine = vLine.Trim() + "," + row.Cells[x].DateCellValue.ToString("yyyy/MM/dd");
                                    }
                                    else {
                                        vLine = vLine.Trim() + "," + row.Cells[x].NumericCellValue.ToString();
                                    }
                                }
                                else {
                                    vLine = vLine.Trim() + "," + row.Cells[x].ToString();
                                }
                            }
                        }
                    }

                    //ICell cell = row?.GetCell(0);

                    //Excelの内容を書き込む
                    sw.WriteLine(vLine);
                }
            }
        }

0 件のコメント:

コメントを投稿