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);
}
}
}
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿