2017年8月28日月曜日

C# RIght関数

       static string Right(this string stTarget, int iLength) {
            if (iLength <= stTarget.Length) {
                return stTarget.Substring(stTarget.Length - iLength);
            }

            return stTarget;
        }

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);
                }
            }
        }

62進数+32=94進数

前に62進数を考えたが、記号も含めれば94進数いけると思う

62進数文字列
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

上記にプラス32文字列
!"#$%&'()-=~^|@[]{};:],./\+*<>?_

記号だけで32文字列もあるとは

92*92=8464 2桁だけで10進数 8464まで表現出来る。


2017年8月10日木曜日

RemoteAppsでシステム構築

WindowsのRemoteAppsでシステム構築を構想中

理由:
1:端末にプログラムインストールが要らない。
2:プログラム更新はサーバサイド
3:端末OSはどれでもOK

dbMAGICのリッチでOneソース マルチプラットフォームで対応だけど
RemoteAppsでOneソース  マルチプラットフォームに対応した方が
dbMAGICのクラサバで構築出来るから、メンテが楽と考えた。

基幹システムがdbMAGIC
ワークフロー&グループウェアもdbMAGIC

ワークフロー&グループウェアもdbMAGICで出来ないと諦めていたが
MAGIC XPA 3.1以降、.NETフォームを使用したことにより
クラサバ画面で Web Browserを表示できるようになっていた。

※UniPaasでは、クラサバのフォームでは.NETが使えないから
ActiveX経由でWeb Browserが表示出来ていた。

クラサバでWeb Browser表示出来るなら
dbMAGICのMergeを使ってhtml5を生成を行い
ワークフロー&グループウェアの予定などの部分を html5で補うとこが出来る。

エスケープキーで終了出来るhtml5フォーム画面
やはり、キーボード&PFキーが使える方が入力は楽です。

dbMAGICの再認識でした。

2017年8月9日水曜日

NPOI

今までEXCELシートの情報を読むとき EPPLUSのライブラリを使っていたが
どうしても EXCEL2003のシートを読む必要が出てきた。

調べると NPOIで EXCEL2003形式が読める。

nugetから取得出来るし、最近はライブラリが簡単に取得出来るので楽になっていると
感じます。

sample code
using NPOI.SS.UserModel;

// (WorkbookFactory.Create()を使ってinterfaceで受け取れば、xls, xlsxの両方に対応できます)
IWorkbook workbook = WorkbookFactory.Create("d:\\Book1.xlsx");
ISheet worksheet = workbook.GetSheetAt(0);
int lastRow = worksheet.LastRowNum;
for (int i = 0; i <= lastRow; i++)
{
    IRow row = worksheet.GetRow(i);
    ICell cell = row?.GetCell(0);
    Console.WriteLine(cell?.StringCellValue);
}