\

C# かんたんウェブスクレイピング(AngleSharp)

C# で簡単にウェブスクレイピングをする方法を紹介します。

document.GetElementByIddocument.QuerySelectorAll などを使って簡単にHTMLエレメントを指定できます。

使用するライブラリ

AngleSharp というライブラリを使用します。

ソースコード

このコードでは、ページタイトルと、<h1 class="thumb"> のテキストを取得します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using AngleSharp;
using AngleSharp.Html.Parser;
using System.Net;
using System.Threading.Tasks;

public async Task WebscrapingSample()
{

var urlstring = "https://usefuledge.com";

WebClient wc = new WebClient();
try
{
string htmldocs = wc.DownloadString(urlstring);
Console.WriteLine(htmldocs);

var config = Configuration.Default;
var context = BrowsingContext.New(config);
var document = await context.OpenAsync(req => req.Content(htmldocs));

Console.WriteLine(document.Title);

foreach ( var item in document.QuerySelectorAll("h1.thumb"))
{
Console.WriteLine(item.TextContent.Trim());
}


}
catch (System.Exception)
{
throw;
}


}

実行結果

こんな風に出力されると成功です。

1
2
3
4
5
6
7
8
9
10
11
Page 1 | Useful Edge
c# ClosedXMLを使用して、xlsxファイル内の文字列を検索する
バッチ処理で Oracle PLSQL を実行してリターンコードを得る
UiPath : Excel表のデータを取得してAccessデータベースへインサートする
広告を出すよりもファンを作ることの方が大事かもしれない
業務アプリを設計するときに大事なこと
アプリ開発を個人や少人数の会社に発注するメリットとデメリット
c#でExcelを編集可能なライブラリ
作業効率化を目的としたWindows・OfficeVBAアプリケーションを開発します
お問い合わせ
会社にお金を出させる方法。どうしたらシステム外注予算を確保してもらえるか

htmlソースのダウンロード

指定したURLのHTMLをダウンロードして変数 htmldocs に格納します。

1
2
3
4
var urlstring = "https://usefuledge.com";

string htmldocs = wc.DownloadString(urlstring);
Console.WriteLine(htmldocs);

htmlドキュメントを Anglesharp の document オブジェクトに格納

3行目で、さきほど取得したhtmldocsをセットして、documentオブジェクトを取得してます。

1
2
3
var config = Configuration.Default;
var context = BrowsingContext.New(config);
var document = await context.OpenAsync(req => req.Content(htmldocs));

ページタイトル取得

document オブジェクトの Titleプロパティで取得できます。

1
Console.WriteLine(document.Title);

h1 タグの thumb クラスで指定されているテキストを取得

document.QuerySelectorAll("h1.thumb") でHTMLエレメントを指定します。

foreach で1つずつループします。

最後に、TextContentプロパティで取得すれば完了です。

1
2
3
4
foreach ( var item in document.QuerySelectorAll("h1.thumb"))
{
Console.WriteLine(item.TextContent.Trim());
}

以上、C#でかんたんウェブスクレイピングでした。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱

c# ClosedXMLを使用して、xlsxファイル内の文字列を検索する

ClosedXMLは ExcelやWordなど、XMLドキュメントのファイルを読み書きできるオープンソースのライブラリです。

ClosedXML ロゴ

https://github.com/ClosedXML/ClosedXML

実行環境にExcelがインストールされていなくても、Excelファイルを読み書きできます。

ClosedXMLを使う際の注意点として、xls形式(旧 Excel 2003以前のファイル形式)が処理できないということです。

この記事では、ClosedXMLを用いて、xlsxファイル内の文字列を検索して結果を表示する処理をC#で実装する方法を紹介します。

ソースコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82

/// <summary>
/// 検索結果クラス
/// </summary>
public class SearchResult
{
/// <summary>
/// ワークシート名
/// </summary>
public string workSheetName {get; set;}

/// <summary>
/// 行番号
/// </summary>
/// <value></value>
public int rowNumber{get; set;}

/// <summary>
/// 列番号
/// </summary>
/// <value></value>
public int colNumber{get; set;}

/// <summary>
/// セル値(文字列型)
/// </summary>
/// <value></value>
public string cellStringValue{get; set;}
}


/// <summary>
/// xlsxファイル内を文字列検索する
/// </summary>
/// <param name="searchTerms">検索文字列</param>
/// <param name="xlsxFileFullPath">検索対象xlsxファイルパス</param>
/// <returns>検索結果(SearchResultClass)</returns>
public List<SearchResult> SearchTermsInXlsx(string searchTerms, string xlsxFileFullPath)
{

List<SearchResult> listSearchResult = new List<SearchResult>();

using(var wb = new XLWorkbook(xlsxFileFullPath))
{

foreach(var ws in wb.Worksheets){

string wsName = ws.Name;

//終端行番号取得
int lastRowUsedNumber = ws.LastRowUsed().RowNumber();

//終端列番号取得
int lastColUsedNumber = ws.LastColumnUsed().ColumnNumber();

int wRow = 0;
int wCol = 0;

for(wRow = 1; wRow <= lastRowUsedNumber; wRow++)
{
for (wCol = 1; wCol <= lastColUsedNumber; wCol++)
{
// Console.WriteLine($"{wRow}:{wCol} in {wsName} {ws.Cell(wRow, wCol).Value.ToString()}");

SearchResult sr = new SearchResult();
sr.workSheetName = wsName;
sr.rowNumber = wRow;
sr.colNumber = wCol;
sr.cellStringValue = ws.Cell(wRow, wCol).Value.ToString();

// セル文字列の中に検索文字列が含まれている場合、リストオブジェクトへ追加する
if(sr.cellStringValue.Contains(searchTerms)){
listSearchResult.Add(sr);
}


}
}
}
}
return listSearchResult;
}

クラスと関数

SearchResult はクラスです。以下のメンバーを定義しています。

  • workSheetName : ワークシート名
  • rowNumber : 検索してヒットした行番号
  • colNumber : 検索してヒットした列番号
  • cellStringValue : 検索してヒットしたセルの値(文字列型)

SearchTermsInXlsx は関数です。入出力関係は以下のとおり定義しています。

  • 入力
    • searchTerms : 検索文字列
    • xlsxFileFullPath : 検索対象xlsxファイルフルパス
  • 出力
    • List<SearchResult> : 検索結果をリスト型のSearchResultクラスに格納します。

xlsxワークブックを開く

1
var wb = new XLWorkbook(xlsxFileFullPath)

XLWorkbook関数にxlsxファイルパスを入力して、ワークブックオブジェクト(wb)を取得します。

ワークシートを1つずつループする

1
2
3
foreach(var ws in wb.Worksheets){
...
}

ワークシートコレクションは、wb.Worksheetsで取得します。

foreach を使用して、ワークシート一つずつを wsにセットします。

ワークシート名取得

1
string wsName = ws.Name;

ワークシート名は ws.Name で取得できます。

終端行番号、列番号の取得

1
2
3
4
5
//終端行番号取得
int lastRowUsedNumber = ws.LastRowUsed().RowNumber();

//終端列番号取得
int lastColUsedNumber = ws.LastColumnUsed().ColumnNumber();

そのシートの、一番下の行と一番右の列の番号を取得します。

番号ですので、取得する型は int型です。

終端行番号は ws.LastRowUsed().RowNumber() 列番号は ws.LastColumnUsed().ColumnNumber() で取得できます。

セルの値を取得する。

今回は、文字列型として取得します。セルに計算式が入っている場合、計算結果を取得します。

1
ws.Cell(wRow, wCol).Value.ToString();

ws.Cellオブジェクトに、行番号と列番号をセットし、.Valueプロパティで取得します。

文字列内に指定した検索条件が含まれているか判断する

1
sr.cellStringValue.Contains(searchTerms)

Containsは、Stringオブジェクトに含まれているメソッドです。

String.Contains Method - Microsoft Docs

検索対象文字列.Contains(検索文字列) で 取得できます。返り値は bool 型です。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱

バッチ処理で Oracle PLSQL を実行してリターンコードを得る

Oracle PLSQL は VB.net などのプログラムから実行することもあれば、Windowsバッチなどのスクリプト言語で バッチ処理で実行することもあると思います。

この記事では、バッチ処理で PLSQL を実行してリターンコードを得る方法を記載します。

PLSQL 実行ファイル

1
2
3
4
5
6
7
8
9
10
11
SET SERVEROUTPUT ON

variable RETCODE number;
variable PSTR_PARAM varchar2(300);

execute :PSTR_PARAM := 'Param1';
execute :RETCODE := PlsqlBody.PlsqlFunction(:PSTR_PARAM);

COMMIT;

exit :num

SET SERVEROUTPUT ON で、 標準出力に出力された値を出力します。

Oracle PLSQL では、dbms_output.put_line() で標準出力に出力します。

1
2
variable num number;
variable PSTR_PARAM varchar2(300);

ここで、変数を定義しています。

  • num は PLSQL のリターンコードを格納する変数です

  • PSTR_PARAM は PLSQL の引数です。

    execute :PSTR_PARAM := ‘Param1’;
    execute :num := PlsqlBody.PlsqlFunction(:PSTR_PARAM);

execute で 処理を実行します。 1行目は PSTR_PARAM に値を格納しています。 2行目は PlsqlBody.PlsqlFunction() を実行してリターンコードを num に格納しています。

1
COMMIT;

トランザクションをコミットします。

1
exit :num

exitコマンドに与えられた数値をリターンコードとし、 PLSQL処理を終了します。

Windows バッチファイル側の記述

Windows バッチ側では以下のように記述して呼び出します。

1
SQLPLUS ユーザーID/パスワード@SID  PLSQL実行ファイルパス  >> 標準出力の出力先

ちなみに、PLSQL側でリターンコードの返し方

1
RETURN 0;

とすれば、 0 が返ります。

1
RETURN 1;

とすれば、 1 が返ります。

ちなみに② Exception の書き方

1
2
3
4
5
6
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('SQLCODE : ' || SQLCODE);
dbms_output.put_line('SQL ERROR MESSAGE : ' || SQLERRM);

RETURN SQLCODE * (-1);

とすれば、SQLエラーメッセージとエラーコードを取得してリターンします。

この辺は、スケルトンコードとして整備しておきたいなぁ。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱

UiPath : Excel表のデータを取得してAccessデータベースへインサートする

UiPathはRPA製品の1つで、プログラミング不要で作業を自動化するロボットを開発することができます。

この記事では、Excel表のデータを取得して、Accessデータベースへインサートする処理をUiPathで構築する方法を紹介します。

1. 入力となるExcelテーブル

SampleDatabase.xlsx(AccessDB入力データ)

ファイル名を「SampleDatabase.xlsx」とします。1行目がヘッダで2行目からデータになります。

項目は、左から「なまえ」「役職」「給料」になります。

2. 出力先のAccessデータベース

SampleDatabase.accdb(出力先AccessDB)

ファイル名を「SampleDatabase.accdb」とします。テーブル定義は以下のとおりです。

フィールド名 データ型
なまえ 短いテキスト
役職 短いテキスト
給料 通貨型

サンプルテーブル定義

3. UiPathに必要なパッケージ

Accessデータベースを操作するアクティビティを使用するため、「UiPath.Database.Activities」というパッケージをインストールします。

UiPathパッケージインストール

4. UiPath シーケンス

全体像は以下のとおりです。

UiPathAccessデータベース書き込みシーケンス

処理順序は、以下のとおりになります。

  1. Excelアプリケーションスコープを使用して、「SampleDatabase.xlsx」を開く
  2. 範囲を読み込みアクティビティを使用して、データテーブルへ取得する
  3. 接続アクティビティを使用して、Accessデータベースへ接続する
  4. 繰り返し(各行)アクティビティを使用して、データテーブル内を1行ずつループ
  5. 非クエリを実行アクティビティを使用して、INSERTクエリを発行
  6. 切断アクティビティを使用して、Accessデータベースの接続を切断する

5. 接続アクティビティ

接続アクティビティ

接続アクティビティを使用して、Accessデータベースへの接続情報を作成します。

接続ウィザードを使用して作成していきます。

接続編集画面

データソースは、「Microsoft Access Database File」を選択します。

Datasource選択画面

「Database file name」に「SampleDatabase.accdb」のパスを指定します。

ユーザー名とパスワードは初期値のままでOKです。「Test connection」ボタンをクリックし、接続確認を行います。

接続プロパティ画面

接続に成功すると、以下の画面が表示されます。

接続確認成功画面

「OK」ボタンをクリックして閉じます。

接続編集画面(設定完了後)

今後の処理で接続情報を使用するため、出力プロパティの「データベース接続」に「Con」変数を追加しておきましょう。

接続アクティビティプロパティ

6. 非クエリを実行アクティビティ

非クエリを実行アクティビティ

このアクティビティで、INSERTクエリを発行します。INSERTクエリは以下のように定義します。

1
"INSERT  INTO  サンプルテーブル  VALUES  (@NAME, @POST, @SALARY)"

SQL編集画面

パラメータに、データテーブルから取得した値をセットします。

SQLプロパティ設定画面

「接続設定」プロパティの「既存の接続」に「Con」を指定します。

非クエリを実行アクティビティプロパティ

7. 切断アクティビティ

切断アクティビティ

Accessデータベースへの接続を切断します。

「接続」プロパティの「データベース接続」に変数「Con」を指定します。

切断アクティビティプロパティ

8. 実行方法と結果

「ファイルを実行」から実行します。

実行方法

このように、データが格納されることを確認します。

実行結果(Accessデータベース)

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱

広告を出すよりもファンを作ることの方が大事かもしれない

ファンは顧客全体の2割、その中でもコアなファンは全体の4%ほどと言われています。
しかし、その2割程度のお客様で全体の売上の8割を占めているというデータがあります。

この記事では、売上や新規顧客を増やす場合、広告ではなくファンを増やす方がいいと思うという内容を書きます。

この記事の出展

このブログ記事は、「ファンベース(著者:佐藤 尚之さん)」の内容を元に書きました。

ファンベースについて詳しく知りたい方は、本を読まれてみるといいかと思います。

ファンベース ──支持され、愛され、長く売れ続けるために (ちくま新書) Kindle版

「かもしれない」と書いているのは、なぜ?

自分は個人開発をしておりますが、広告については、Twitter広告は出したことくらいしかありません。マーケティング業界の人間でもなければ、ファンと呼べるほどのユーザー様も持ったこともありません。

そのため、この記事は私の実体験ではなく、本に書かれていた内容に共感したために書いた記事になります。

ファンはユーザーの2割程度の人数であるが、売上全体の8割を占める

冒頭にも書きましたが、ファンと呼べるほどの熱心なユーザーは、全体の2割程度しかいません。しかし、ファンは心からその製品が好きなので、友人や親戚に進めたり、メーカーに対して積極的に改善意見を提案します。

これらのファンの行動が功を奏して、売上全体の8割を占めるそうです。パレートの法則がそのまま実態になって現れていますね。

ちなみにパレートの法則とは、別名「80:20の法則」とも言われており、全体の数値の大部分は一部の要素が生み出している、という法則です。

詳しい説明は、Wikipediaなどを参考にしてみるといいと思います。

パレートの法則

広告はときに鬱陶しい

例えばYouTube動画の再生前、テレビ番組の途中、ゲームの途中など、集中を遮って強制的に広告が流れ始めるので、本当に鬱陶しく思います。

特に興味もない広告が流れてきても、クリックする気持ちになれるはずがありません。

本当に必要としている内容であれば、動画やゲームの途中ではなく、自分のタイミングで検索して商品を探すでしょう。

ファンの人数は最初は少なくても、少しずつ大きくなる

ファンとは、心からその製品や会社が好きな人です。そんな方とはなかなか遭遇できません。そのため、ファンの人数はごく少数です。しかし、そのごく少数のファンの方々は、知人や友人に広めたり、改善提案をしてくれたりします。

改善提案を取り込むと、提案してくれたファンはとても喜びます。また感謝もしてくれますので、担当者もうれしくなり、いいサイクルが回り始めます。

このサイクルを回していくことで、ファンがコアファンになり、その商品を、より多くの知人や友人に紹介してくれるようになります。ユーザーが増えて、売上に繋がっていきます。

ファンに喜んでもらえるのは、開発者として楽しい

ファンだけではありませんが、純粋にユーザーに喜んでもらえる商品を作るのは楽しいです。広告という一方通行のコミュニケーションではなく、双方向のコミュニケーションを通して、商品を改善してく。その商品を使ってもらって喜んでもらえる。そのような仕事ができれば、普通の会社員では味わえないような充実感と達成感があるのではと思います。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱

業務アプリを設計するときに大事なこと

この記事では、業務アプリケーションを設計するときに大事なことについて書いてみたいと思います。

私は2020年で業務アプリケーションのシステムエンジニア歴11年目になります。6年間は社内SEとしてシステム開発をしていますが、基本的な設計スキルを身につけていれば応用が効くと思います。

1. 業務フロー図を作成して、業務の流れを理解しよう

業務アプリケーションですので、何かの業務を行うシステムを構築しようとしていることは間違いありません。

そのため、そのシステムの裏側には業務をしている人間が必ず居ます。

この業務を理解していないと、使えないシステムが出来上がってしまう危険性があります。

業務内容をドキュメント化するのに1番手っ取り早いのは、業務フロー図を書くことです。

  • どこの部門が、どんな作業をするか
  • 作業するとき、何がインプットになっているか
  • その作業をした結果、どんなアウトプットがあるか
  • そのアウトプットは、どこにインプットされるのか
  • システムと作業はどのように関連があるか

業務フロー図の登場人物は、だいたい以下のとおりです。

  • 業務部門
  • システム
  • 取引先などの他社、外部組織

会社は、部門もシステムも取引先も複数存在すると思います。対象が多くなれば多くなるほど、複雑性が増していきます。

2. システムが出力して担当者が目にするモノをまとめよう

システムが出力して、担当者が目にするモノ、それは帳票やラベルやデータ、画面に表示される情報など、たくさんあります。

これらは外部設計になります。また業務に直結する情報になりますので、担当者とよくよく話しをしながら設計していく必要があります。

業務システムの1番大事なところは、正しいアウトプットを業務担当者や他システムに連携できるかどうか、です。

帳票設計

帳票であれば、印字項目と編集条件、出力タイミング、再発行可否、これらが設計のメインになります。
紙に印刷するのか、電子帳票としてサーバーに出力するか、PDFなどのファイル出力にするのかも検討しましょう。

画面設計

画面設計で必要なことは、表示する内容だけでなく、ボタンをクリックした場合にどのような動作するか、データの更新を許可するかどうかなど、たくさんあります。

画面設計では、目的を明確にしておくと設計しやすくなります。データ参照のみの画面、既存データの更新のみ許可する画面、新しくデータを新規作成する画面、などです。

また、PC画面が必要なプログラムはデータ照会/更新系だけでなく、データ出力系、ステータス更新系など様々です。

業務フロー図に則り、必要な機能を必要な分だけ設計・構築しましょう。

3. システム間連携インタフェースを設計しよう

業務システムは複数存在するのが一般的です。ERPのような基幹業務システムを柱とし、EDIやデータウェアハウス、その他業務システムなどが構築されているパターンが多いと思います。

案件によっては1つのシステム内で留まる改修もあります、複数システム跨って改修が必要になる案件もあります。

他システムへデータ連携が必要になる場合、インタフェース設計を行いましょう。

インタフェースは、システム間でデータを受け渡す役割があります。CSVであったりテキストファイルであったり、データ形式は様々ですが、インタフェース設計に
不具合があると、手戻りが大きくなります。入念に設計しておきましょう。

4. 最後に

業務システムの設計は、業務知識が豊富にあるほど有利です。また、大規模システムを構築した経験も有利に働きます。大規模システムであれば、
システムが複数存在してインタフェース設計が必要になったり、複数部門が密接に連携して作業内容や帳票も膨大になるためです。

大規模システムの設計経験があれば、小規模のシステムにおいてお十分に高い品質を保った設計ができます。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱

アプリ開発を個人や少人数の会社に発注するメリットとデメリット

こんなツイートをしました。


VBAや作業効率化アプリの開発を個人に発注するメリット

①安い ②柔軟な仕様変更

一方、デメリットは、 ①大規模なシステムを開発できない

でもこのデメリットも、開発メンバーを集めたり、NoCodeで作れば、解決可能😊


https://twitter.com/harus0313/status/1264003877998747648?s=21

アプリケーションの開発は、企業であればSIerと言われるような大手システムベンダーに発注することが殆どです。 しかし、個人や少人数の会社でも高いシステム開発スキルをもった人は多くいます。

この記事では、アプリケーション開発を個人・少人数の会社に発注することのメリットとデメリットについて紹介します。

アプリケーション開発を個人・少人数の会社に発注するメリット

  1. 営業費や間接費が少ないから、費用が安い
  2. 仕様変更を柔軟に受けられる

メリットは、なんと言っても間接費が少ないことです。経理や営業などの間接部門担当者がいなかったり、 オフィスの賃貸料が安い、もしくはオフィスがなかったり、します。

そのため、システムベンダーよりも間接費用や設備費用がかなり安いことが多いです。

これらの費用が開発費用に含まれないため、総じて安くなります。

また、仕様変更を柔軟に受けられることもあります。

仕様変更は内容によっては影響の大きいこともあり、システムベンダーによっては追加費用を取られることが殆どです。

しかし一方で、個人もしくは小規模なチームだと、コミュニケーションがスムーズに行われますので、意思疎通が容易になり、影響調査の迅速化、修正工数の削減が見込まれます。

これは大規模なシステムベンダーには無い、高いスキルをもった少数精鋭のチームだからできることです。

仕様変更が柔軟に受けられると、発注側にとっては大きなメリットになるかと思います。

アプリケーション開発を個人・少人数の会社に発注するデメリット

  1. 大規模なシステムは開発できない
  2. コアな業務知識が必要な場合は、設計に時間がかかる

まず、大規模なシステム開発についてですが、これは単純に人手が必要になります。100人月など大規模なシステム開発であれば、1人で行おうとすると、100ヵ月かかってしまいます。

また、コアな業務知識が必要な場合、エンジニアによっては知識を持っていない場合があります。その場合、基本設計に時間がかかることが殆どです。

業務知識と言っても、業界標準的な知識であれば、知っているもしくはシステム開発スキルがあるエンジニアは多くいます。

ここで言うコアな業務知識とは、その会社にしかない作業手順であったり、クローズドな知識のことを差します。

これらのデメリットについては、克服方法があり、次で説明します。

デメリットを克服する方法

  1. 大規模なシステム開発は、開発メンバーを揃えてもらう、分散発注する、NoCodeツールなどを駆使して開発工数を削減させる
  2. コアな業務知識が必要な場合は、基本設計は内製で行い、プログラミング工程を発注する。

まず大規模システム開発については、人手がかかる作業をどうこなしていくかを考える必要があります。

これについては、

  • 開発メンバーを揃える
  • 分散発注
  • NoCodeツールなどを駆使して工数削減

が効果的です。

1つ目、受注者側に開発メンバーをそろえてもらう場合は、プロジェクトマネジメントの経験をもっているかどうかを見極めることが重要です。

開発担当者が多いとスキルにばらつきが出ますので、そのばらつきをどう抑えて、納期までに十分な品質を保ったシステムを納品するか、

これがプロジェクトマネージャーの仕事であり、必要不可欠なスキルです。

発注前に必ず、資格や経験があるか、聞いてみましょう。

2つ目、分散発注ですが、開発対象の機能を複数に分けて発注する方式です。

これは発注者側がプロジェクトマネジメントをする必要がありますので、しっかりとコントロールすることが重要です。

また、分散発注を基本設計から行う場合で、インタフェース設計などシステム連動に関する設計を任せる場合は注意が必要です。

各開発担当者の間で、受け渡すデータの形式、入力・出力内容を明確にしておく必要がありますので、綿密なコミュニケーションが必要不可欠です。

可能であれば、発注者側で基本設計ができればベストです。

3つ目、NoCodeツールなどを駆使して工数削減ですが、これが一番効果があると思います。

どんなシステムでも決まりきった処理や画面構成というものがありますので、そのような処理は、人間がコーディングするよりも ツールで自動生成したほうがよっぽど品質が高いです。

これから先の時代、人間がすべてコーディングすることは無くなります。エンジニアは今のうちにNoCodeツールを使えるようになっておくべきです。

また、発注者側も、どれだけ効率よく開発できるスキルがあるのか見極め、パフォーマンスの良いエンジニアに依頼するべきと思います。

どんな案件が個人への発注に向いているか

上記を踏まえて、どんな案件が個人・小規模事業者への発注に向いているか、まとめてみましょう。

  1. 小規模なツールの開発依頼
  2. プログラミング工程以降の依頼
  3. NoCodeツールなどで工数削減が見込まれるシステムの開発

まず1つ目、小規模なツールの開発依頼であれば、個人で基本設計からでも十分対応可能です。ツールというものは機能がある程度限定されていますから、開発規模がそこまで大きくなりません。

2つ目のプログラミング工程以降の依頼ですが、これは基本設計を自社またはシステムベンダーに依頼し、プログラミング工程からを個人や小規模ベンダーへ発注する方式です。基本設計はどうしても業務の内容が色濃く出てしまいますが、プログラミング工程からは、プログラミングの知識があれば誰でも作業可能です。

間接費用やマージンが少ないため、個人に発注すれば比較的安価に対応が可能でしょう。

最後に3つ目ですが、これはプログラミング工程の作業効率を向上させる方法です。決まりきったロジックであれば、人間がコーディングする必要はありません。NoCodeツールに自動生成してもらえばいいのです。その方が品質も費用も格段に良くなります。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱

c#でExcelを編集可能なライブラリ

c#でExcelファイルの読み込み・書き込み処理ができると、システムの幅が広がります。 VBAでしたらExcel上でしか実行できませんが、c#で実現できれば、ウェブアプリにしたりWindowsアプリにしたり AWS Lambda などのクラウド上にのせたり、いろいろなことができるようになります。

この記事では、c#でExcelを編集可能なライブラリについて紹介します。

Microsoft.Office.Interop.Excel

公式ドキュメント https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.interop.excel

Microsoft.Office.Interop.Excel は Excelアプリケーションを直接操作するライブラリです。そのため、実行するサーバーやPCにExcelがインストールされている必要があります。

ただし、メリットもあり、再計算などExcelアプリケーションの機能がすべて使用できるのもその1つです。

サンプルコード

Excelファイルを開き、再計算して保存して終了という処理を行うコードです。 一部の変数定義や値セットを省略しています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//using Excel = Microsoft.Office.Interop.Excel;

// Excelインスタンスを生成する
Excel.Application xlApp = new Excel.Application();

// Excelウィンドウを表示しない
xlApp.Visible = false;

// Excel警告メッセージを表示しない
xlApp.DisplayAlerts = false;

try
{
// Excelファイルを開く
Excel.Workbook templateBook = xlApp.Workbooks.Open(inputFilePath);

//再計算
xlApp.CalculateFull();

// xlsx 形式で出力ファイルパスへ保存する
templateBook.SaveAs(outputFilePath);

//Excelファイルを閉じる
templateBook.Close();

}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
xlApp.Quit();
// Excelインスタンスを破棄する

}

EPPlus

公式ドキュメント https://epplussoftware.com/

Github https://github.com/EPPlusSoftware/EPPlus

Nuget https://www.nuget.org/packages/EPPlus/

ライセンスが LGPL から Poly Noncommercial に変更になっています。

公式ドキュメントには、コマーシャルライセンス(Commercial license)と開発者(Developer)の2つのライセンスの表記があります。 ライセンスドキュメントを熟読してライブラリ選定が必要です。

サンプルコード

EPPlusを使用して、xlsxファイルを新規作成して保存するコードです。

1
2
3
4
5
6
7
8
9
10
11
12
//using OfficeOpenXml;

public void EPPlusTutorial1()
{
FileInfo xlsFile = new FileInfo(@"d:\epplussample.xlsx");
using (var package = new ExcelPackage(xlsFile)){
var sheet = package.Workbook.Worksheets.Add("epplus");
sheet.Cells["A1"].Value = "Hello UE";

package.Save();
}
}

ClosedXML

Github https://github.com/ClosedXML/ClosedXML

Nuget https://www.nuget.org/packages/ClosedXML

ClosedXMLは、Excel2007形式(xlsx, xlsm)のファイルを作成、編集、書き込みするためのライブラリです。

サンプルコード

これも同じように、新規ブックファイルに書き込んで保存するコードです。

//using ClosedXML.Excel;

    public void ClosedXMLTutorial1()
    {
        const string excelFilePath = @"d:\closedxmlsample.xlsx";

        using (XLWorkbook wbook = new XLWorkbook())
        {
            var wsheet = wbook.Worksheets.Add("sample");
            wsheet.Cell("A1").Value = "https://usefuledge.com/";

            wbook.SaveAs(excelFilePath);
        }

    }

NPOI

Github https://github.com/tonyqus/npoi

Nuget https://www.nuget.org/packages/NPOI/

NPOIはExcel2007(xlsx)だけでなく、Excel2003(xls)のファイルも読み書きができるライブラリです。

公式リポジトリの中にサンプルコードが豊富に格納されています。有り難いですね。

https://github.com/tonyqus/npoi/tree/master/examples

サンプルコード

NPOIは他のライブラリに比べると、分かりにくい印象です。

1
2
3
4
5
6
7
8
9
10
11
12
//using NPOI.XSSF.UserModel;
//using NPOI.SS.UserModel;

public void NPOITutorial1()
{
string xlsFile = @"d:\npoisample.xlsx";
IWorkbook book = new XSSFWorkbook();

ISheet sheet = book.CreateSheet("npoisheet");

book.Write(new FileStream(xlsFile, FileMode.Create, FileAccess.ReadWrite));
}

作業効率化を目的としたWindows・OfficeVBAアプリケーションを開発します

詳しくはこちらに記載しております。不明な点がありましたら、お問い合わせフォームからご連絡をお願いします。

https://usefuledge.com/appdev.html

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱

作業効率化を目的としたWindows・OfficeVBAアプリケーションを開発します

WindowsやExcelなどのOfficeVBAを用いたアプリケーション開発サービスを開始しました。

解決したい問題

私は11年間システムエンジニアとして働いております。2020年になりましたが、まだまだたくさんの人が 手作業が多くのPC作業をこなしています。

仕事柄、作業効率化を目的としたアプリケーションを数多くリリースしてきましたが、それでもまだまだ、人間はPC作業から解放されません。 単純労働から解放されて、知的労働に集中するべきと思います。

どんなアプリケーションを作ってきたの?

主なものでは、私は今までに以下のシステム・アプリケーションを導入・開発してきました。

  1. メキシコ工場生産管理システム(成型生産管理システム、在庫管理システム)
    • ITシステム統括責任者としてプロジェクトに従事
    • 要件定義から実施し、現地メキシコ工場へ出張し、導入・運用保守を担当
    • 総額2,000万円を超える巨大プロジェクト
  2. RPA製品の選定および社内導入(UiPath)
    • RPAによる作業自動化が求められたため、RPA製品の選定検討から、社内業務のヒアリングおよび適用業務の選定、導入を実施
    • 営業部の受注登録作業の自動化をRPAで構築し、年間 960,000円の費用削減・作業効率化を実現した。
  3. ExcelやAccess、Outlookを用いたPC事務作業自動化アプリケーション開発
    • メール自動送信システム
    • 大量帳票データ作成およびPDF出力
    • データ集計システム、グラフ出力

アプリケーション開発で私がお手伝いできること

  1. どのような機能が必要か、基本設計を行います。
  2. オーバースペックにならないよう、作業規模に合致したプログラムを開発します
  3. 開発したアプリケーションの操作方法ドキュメントを作成し、説明を行います
  4. メールによる問い合わせを無料で対応します

作業効率化を目的としていますので、作業内容のヒアリングから必要な機能の検討、基本設計を行います。 設計から開発まで一気通貫で行うことで、無駄なコストを徹底的に削減します。

初期費用を以下のとおりにさせて頂いております。

  1. Windowsアプリケーション開発:5万円
  2. Excel,Access等、OfficeVBAアプリケーション開発:3万円

規模によりますが、初期費用の範囲内でできることは、

  • メール自動送信
  • 大量帳票データ出力 などは可能です。

動作保証

  1. Windows10で動作保証を行います。
  2. .Net Framework 4 以上または、.Net Core 3 以上で動作保証を行います。
  3. Office365で動作保証を行います。

開発途中のものを一度お渡しし、動作確認を実施させて頂きます。

本当にコストに見合った効果があるの?

ご用命を頂ければ、作業工数削減効果を試算してお渡しします。その内容と見積もり金額を元に、費用対効果を試算ください。

以上となります。ぜひぜひご相談ください!

>> お問い合わせはこちらから

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱

お問い合わせ

こちらのGoogleフォームに記入いただき、お問い合わせくださいますよう、お願いいたします。

当日中に、記載いただいたメールアドレスにご連絡させていただきます。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱