diff --git a/Tool/ExcelToAdocConverter/EcxelToAdocConverter.exe b/Tool/ExcelToAdocConverter/EcxelToAdocConverter.exe
new file mode 100644
index 0000000000000000000000000000000000000000..21244401e2f7de3f5f53447586214403d021c79d
Binary files /dev/null and b/Tool/ExcelToAdocConverter/EcxelToAdocConverter.exe differ
diff --git a/Tool/ExcelToAdocConverter/readme.txt b/Tool/ExcelToAdocConverter/readme.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c736604992e8bbc99818c38d510649b3e9f5632c
--- /dev/null
+++ b/Tool/ExcelToAdocConverter/readme.txt
@@ -0,0 +1,20 @@
+■使い方
+1.EcxelToAdocConverter.exeを起動
+2.エクセルで任意の範囲を選択しコピー
+3."Get AsciiDoc from Clipboad"をクリック
+4.結果をAdocにコピペ
+
+■更新履歴
+==========================
+2021/03/11 rev1
+以下サイトを参考に、エクセルの表をAdoc表記に変換するツールを用意しました。
+(参考)
+[ExcelとかWordでクリップボードにコピーしたデータからAsciiDocの表に変換するツールをつくってみた(結合セル対応)]
+https://qiita.com/kob58im/items/8c3c609b828afbc8fec2
+
+==========================
+2021/03/11 rev2 大島追記
+・水平垂直の揃えに対応しました。
+・デフォルト値を以下のようにしました。
+ ・列の幅は自動調整
+
diff --git a/Tool/ExcelToAdocConverter/source/EcxelToAdocConverter.sln b/Tool/ExcelToAdocConverter/source/EcxelToAdocConverter.sln
new file mode 100644
index 0000000000000000000000000000000000000000..15c6d4cefc045294ea8264fa9181212221fa7c45
--- /dev/null
+++ b/Tool/ExcelToAdocConverter/source/EcxelToAdocConverter.sln
@@ -0,0 +1,31 @@
+サソ
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.28307.1000
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EcxelToAdocConverter", "EcxelToAdocConverter\EcxelToAdocConverter.csproj", "{36AA7526-71EF-4009-B21E-55A0FF4CFA12}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|x64 = Debug|x64
+ Release|Any CPU = Release|Any CPU
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {36AA7526-71EF-4009-B21E-55A0FF4CFA12}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {36AA7526-71EF-4009-B21E-55A0FF4CFA12}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {36AA7526-71EF-4009-B21E-55A0FF4CFA12}.Debug|x64.ActiveCfg = Debug|x64
+ {36AA7526-71EF-4009-B21E-55A0FF4CFA12}.Debug|x64.Build.0 = Debug|x64
+ {36AA7526-71EF-4009-B21E-55A0FF4CFA12}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {36AA7526-71EF-4009-B21E-55A0FF4CFA12}.Release|Any CPU.Build.0 = Release|Any CPU
+ {36AA7526-71EF-4009-B21E-55A0FF4CFA12}.Release|x64.ActiveCfg = Release|x64
+ {36AA7526-71EF-4009-B21E-55A0FF4CFA12}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {0FA1ADE2-6079-4C87-8348-420742F0DD6D}
+ EndGlobalSection
+EndGlobal
diff --git a/Tool/ExcelToAdocConverter/source/EcxelToAdocConverter/App.config b/Tool/ExcelToAdocConverter/source/EcxelToAdocConverter/App.config
new file mode 100644
index 0000000000000000000000000000000000000000..00bfd114afa09381b01f0115be71b65a8ba9284e
--- /dev/null
+++ b/Tool/ExcelToAdocConverter/source/EcxelToAdocConverter/App.config
@@ -0,0 +1,6 @@
+サソ
+
+
+
+
+
\ No newline at end of file
diff --git a/Tool/ExcelToAdocConverter/source/EcxelToAdocConverter/EcxelToAdocConverter.csproj b/Tool/ExcelToAdocConverter/source/EcxelToAdocConverter/EcxelToAdocConverter.csproj
new file mode 100644
index 0000000000000000000000000000000000000000..368e0f55cfe4c47e89709859abb484ebd20d953a
--- /dev/null
+++ b/Tool/ExcelToAdocConverter/source/EcxelToAdocConverter/EcxelToAdocConverter.csproj
@@ -0,0 +1,82 @@
+サソ
+
+
+
+ Debug
+ AnyCPU
+ {36AA7526-71EF-4009-B21E-55A0FF4CFA12}
+ Exe
+ EcxelToAdocConverter
+ EcxelToAdocConverter
+ v4.6.1
+ 512
+ true
+ true
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+ true
+ bin\x64\Debug\
+ DEBUG;TRACE
+ full
+ x64
+ prompt
+ MinimumRecommendedRules.ruleset
+ true
+
+
+ bin\x64\Release\
+ TRACE
+ true
+ pdbonly
+ x64
+ prompt
+ MinimumRecommendedRules.ruleset
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Form
+
+
+
+
+
+
+
+
+ ExcelToAdocConverter.cs
+
+
+
+
\ No newline at end of file
diff --git a/Tool/ExcelToAdocConverter/source/EcxelToAdocConverter/ExcelToAdocConverter.cs b/Tool/ExcelToAdocConverter/source/EcxelToAdocConverter/ExcelToAdocConverter.cs
new file mode 100644
index 0000000000000000000000000000000000000000..e979fd9383fbf97d665d7aee8a47aeb66b6c0707
--- /dev/null
+++ b/Tool/ExcelToAdocConverter/source/EcxelToAdocConverter/ExcelToAdocConverter.cs
@@ -0,0 +1,547 @@
+サソusing System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.IO;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Windows.Forms;
+
+class SampleForm : Form
+{
+ static readonly int ExpectedHeaderMaxLines = 20;
+ static readonly Regex rxTableBeginTag = new Regex(@"
]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase);
+ // 1 2 3 *?縺ッ譛遏ュ繝槭ャ繝 o:p縺ッMS office(word)蟇セ遲
+ static readonly Regex rxTag = new Regex(@"<([a-z][a-z0-9]*|o:p)(|\s[^>]*)>|([a-z][a-z0-9]*|o:p)>|", RegexOptions.Multiline | RegexOptions.IgnoreCase);
+ //static readonly Regex rxTag = new Regex(@"<([a-z][a-z0-9]*)(|\s[^>]*)>|([a-z][a-z0-9]*)>|", RegexOptions.Multiline | RegexOptions.IgnoreCase);
+
+
+ TextBox txtAdoc;
+
+ SampleForm()
+ {
+ Text = "HTML table(Clipborad) to AsciiDoc";
+ ClientSize = new Size(700, 430);
+
+ var btn = new Button()
+ {
+ Size = new Size(280, 25),
+ Text = "Get AsciiDoc from Clipborad",
+ };
+ btn.Click += (s, e) => { ParseFromHtmlClipboard(); };
+ Controls.Add(btn);
+
+ var btnDbg = new Button()
+ {
+ Location = new Point(300, 0),
+ Size = new Size(220, 25),
+ Text = "Get HTML from Clipborad(髢狗匱閠逕ィ)",
+ };
+ btnDbg.Click += (s, e) => { DumpHtmlClipboard(); };
+ Controls.Add(btnDbg);
+
+ txtAdoc = new TextBox()
+ {
+ Location = new Point(0, 30),
+ Size = new Size(700, 400),
+ Text = "",
+ Multiline = true,
+ WordWrap = false, // 謚倥j霑斐@陦ィ遉コ繧偵@縺ェ縺
+ ScrollBars = ScrollBars.Both,
+ };
+ Controls.Add(txtAdoc);
+ txtAdoc.KeyDown += (s, e) => { if (e.Control && e.KeyCode == Keys.A) { ((TextBox)s).SelectAll(); } };
+
+ Resize += (s, e) => { MyResize(); };
+ ResizeEnd += (s, e) => { MyResize(); };
+ }
+
+ void MyResize()
+ {
+ int h = ClientSize.Height - txtAdoc.Top;
+ if (h < 50) { h = 50; }
+ txtAdoc.Size = new Size(ClientSize.Width, h);
+ }
+
+ void ParseFromHtmlClipboard()
+ {
+ MemoryStream ms = GetHtmlClipboard();
+ if (ms != null)
+ {
+ string tmp = Parse(ms);
+ if (tmp != null)
+ {
+ txtAdoc.Text = tmp;
+ txtAdoc.Focus();
+ txtAdoc.SelectAll();
+ }
+ else
+ {
+ txtAdoc.Text = "Parse Failed";
+ }
+ }
+ else
+ {
+ txtAdoc.Text = "Clipboard Load failed";
+ }
+ }
+
+ void DumpHtmlClipboard()
+ {
+ MemoryStream ms = GetHtmlClipboard();
+ if (ms != null)
+ {
+ string tmp = GetHtmlText(ms);
+ if (tmp != null)
+ {
+ txtAdoc.Text = tmp;
+ //txtAdoc.Focus();
+ //txtAdoc.SelectAll();
+ }
+ else
+ {
+ txtAdoc.Text = "Parse Failed";
+ }
+ }
+ else
+ {
+ txtAdoc.Text = "Clipboard Load failed";
+ }
+ }
+
+ static MemoryStream GetHtmlClipboard()
+ {
+ return Clipboard.GetData("Html Format") as MemoryStream;
+ }
+
+ static string GetHtmlText(MemoryStream ms)
+ {
+ int startHtml = -1;
+ int endHtml = -1;
+
+ // 繝倥ャ繝諠蝣ア(StartHTML, EndHTML)繧貞叙蠕
+ // StartHTML:nnnnnnnnnn
+ // EndHTML:nnnnnnnnnn
+ //public StreamReader(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize, bool leaveOpen)
+ // leaveOpen=true縺ァ髢九°縺ェ縺縺ィ縲[s縺碁哩縺倥※縺励∪縺縲
+ using (var sr = new StreamReader(ms, Encoding.UTF8, true, 1024, true))
+ {
+ Regex rx = new Regex(@"^(StartHTML:|EndHTML:)([0-9]+)");
+ int lineCount = 0;
+ string s;
+ while ((s = sr.ReadLine()) != null)
+ {
+ lineCount++;
+ Match m = rx.Match(s);
+ if (m.Success)
+ {
+ int n = Convert.ToInt32(m.Groups[2].Value, 10); // 10騾イ
+ if (m.Groups[1].Value == "StartHTML:")
+ {
+ startHtml = n;
+ }
+ else
+ {
+ endHtml = n;
+ }
+ if (startHtml >= 0 && endHtml > startHtml)
+ {
+ break;
+ }
+ }
+ if (lineCount >= ExpectedHeaderMaxLines)
+ {
+ break;
+ }
+ }
+ }
+
+ // HTML驛ィ蛻繧貞叙蠕(EndHTML縺ッ辟。隕)
+ ms.Position = startHtml;
+ using (var sr = new StreamReader(ms, Encoding.UTF8, false))
+ {
+ return sr.ReadToEnd();
+ }
+ }
+
+ // stype繧ソ繧ー縺ョ荳ュ霄ォ繧定ソ斐☆
+ static string GetStyleText(string htmlText, out int endPos)
+ {
+ string retString = null;
+
+ endPos = 0;
+ int styleStartTagPos = 0;
+ int maxStyleTag = 50;
+ int styletagCounter = 0;
+
+ while (styletagCounter < maxStyleTag)
+ {
+ styletagCounter++;
+ styleStartTagPos = htmlText.IndexOf("", styleStartTagPos);
+ if (styleEndTagPos < 0)
+ {
+ break;
+ }
+ endPos = styleEndTagPos + "".Length;
+
+ int commentStartTagPos = htmlText.IndexOf("", commentStartTagPos);
+ if (commentStartTagPos >= 0 && commentEndTagPos > commentStartTagPos && commentEndTagPos < styleEndTagPos)
+ {
+ // 繧ウ繝。繝ウ繝医ち繧ー縺後≠繧句エ蜷医√さ繝。繝ウ繝医ち繧ー繧帝勁蜴サシ医さ繝。繝ウ繝医ち繧ー蜀縺ョ縺ソ繧定ソ斐☆シ
+ retString += htmlText.Substring(commentStartTagPos, commentEndTagPos - commentStartTagPos);
+ }
+ else
+ {
+ // 繧ウ繝。繝ウ繝医ち繧ー縺後↑縺蝣エ蜷
+ retString += htmlText.Substring(styleStartTagPos, styleEndTagPos - styleStartTagPos);
+ }
+ styleStartTagPos = endPos;
+ }
+ return retString;
+ }
+
+ static int IndexOfUsingRegex(string src, int startPos, Regex rTarget, out int length)
+ {
+ Match m = rTarget.Match(src, startPos);
+ if (!m.Success)
+ {
+ length = 0;
+ return -1;
+ }
+ length = m.Groups[0].Length;
+ return m.Groups[0].Index;
+ }
+
+ // table繧ソ繧ー霎シ縺ソ縺ァ霑斐☆
+ // 繝阪せ繝医ッ險ア螳ケ縺励↑縺(讀懷コ縺励※null繧定ソ斐☆)
+ static string GetFirstTableText(string htmlText, int pos)
+ {
+ int len;
+ int tableStartTagPos = IndexOfUsingRegex(htmlText, pos, rxTableBeginTag, out len);
+ if (tableStartTagPos < 0)
+ {
+ return null;
+ }
+
+ int tableEndTagPos = htmlText.IndexOf("
", tableStartTagPos + len);
+ if (tableEndTagPos < 0)
+ {
+ return null;
+ }
+ int dummy;
+ int tmpPos = IndexOfUsingRegex(htmlText, tableStartTagPos + len, rxTableBeginTag, out dummy);
+
+ if (tmpPos >= 0 && tmpPos < tableEndTagPos)
+ {
+ // 繝阪せ繝医@縺ヲ縺繧具シ磯哩縺倥ち繧ー繧医j繧よ焔蜑阪ョ菴咲スョ縺ォ2縺、逶ョ縺ョ髢句ァ九ち繧ー繧呈、懷コ縺励◆シ
+ return null;
+ }
+
+ tableEndTagPos += "".Length;
+ return htmlText.Substring(tableStartTagPos, tableEndTagPos - tableStartTagPos);
+ }
+
+
+ //static readonly Regex rxCss = new Regex(@":;", RegexOptions.Multiline | RegexOptions.IgnoreCase);
+
+ //static Dictionary> ParseCssPart(string styleText)
+ //{
+ //}
+
+ // https://momdo.github.io/html/syntax.html#attributes-2
+ // 螻樊ァ蜷阪ッ縲∝宛蠕。譁蟄励ゞ+0020 SPACE縲ゞ+0022シ"シ峨ゞ+0027シ'シ峨ゞ+003Eシ>シ峨ゞ+002Fシ/シ峨ゞ+003Dシ=シ峨√♀繧医ウ髱樊枚蟄嶺サ・螟悶ョ1縺、莉・荳翫ョ譁蟄励〒讒区舌&繧後↑縺代l縺ー縺ェ繧峨↑縺縲HTML讒区枚縺ォ縺翫>縺ヲ縲∝、匁擂隕∫エ縺ォ蟇セ縺吶k繧ゅョ縺ァ縺輔∴縲∝ア樊ァ蜷阪ッ縲、SCII蟆乗枚蟄励♀繧医ウASCII螟ァ譁蟄励ョ莉サ諢上ョ邨縺ソ蜷医o縺帙〒譖ク縺九l縺ヲ繧ゅh縺縲
+ // 螻樊ァ蛟、縺ッ縲√ユ繧ュ繧ケ繝医′譖匁乂縺ェ繧「繝ウ繝代し繝ウ繝峨r蜷ォ繧√k縺薙→縺後〒縺阪↑縺霑ス蜉縺ョ蛻カ髯舌r繧ゅ▽蝣エ蜷医r髯、縺阪√ユ繧ュ繧ケ繝医♀繧医ウ譁蟄怜盾辣ァ縺ョ豺キ蜷育黄縺ァ縺ゅk縲
+ // 蠑慕畑隨ヲ縺ァ蝗イ縺セ繧後↑縺螻樊ァ蛟、讒区枚
+ // ASCII遨コ逋ス譁蟄 U+0022 QUOTATION MARK譁蟄暦シ"シ峨
+ // U+0027 APOSTROPHE譁蟄暦シ'シ峨ゞ+003D EQUALS SIGN譁蟄暦シ=シ峨
+ // U+003C LESS-THAN SIGN譁蟄暦シ<シ峨ゞ+003E GREATER-THAN SIGN譁蟄暦シ>シ峨
+ // 縺セ縺溘ッU+0060 GRAVE ACCENT譁蟄暦シ`シ画枚蟄励r蜷ォ繧薙〒縺ッ縺ェ繧峨★縲√°縺、遨コ譁蟄怜励〒縺ゅ▲縺ヲ縺ッ縺ェ繧峨↑縺縲
+
+ // 1 = 2 3 4
+ // <-------------------------------------> <--------------------------------> <-----> <------->
+ // <---------------------------------------------------------------->
+ static readonly Regex rxAttr = new Regex(@"\b([^\x00-\x1F\x20\x22\x27\x2F\x3D\x3E]+)\s*(?:=\s*(?:([^\x20\x22\x27\x3C\x3D\x3E\x60]+)|'([^']*)'|\x22([^x22]*)\x22))?", RegexOptions.Multiline | RegexOptions.IgnoreCase);
+
+ static Dictionary ParseAttrs(string attrsStr)
+ {
+ var dict = new Dictionary();
+
+ Match mAttr = rxAttr.Match(attrsStr);
+ while (mAttr.Success)
+ {
+ string key = mAttr.Groups[1].Value.ToLower();
+
+ string value = "";
+ if (mAttr.Groups[2].Length > 0)
+ {
+ value = mAttr.Groups[2].Value;
+ }
+ else if (mAttr.Groups[3].Length > 0)
+ {
+ value = mAttr.Groups[3].Value;
+ }
+ else if (mAttr.Groups[4].Length > 0)
+ {
+ value = mAttr.Groups[4].Value;
+ }
+ else
+ { // without "="
+ // do nothing
+ }
+
+ if (!dict.ContainsKey(key))
+ {
+ dict.Add(key, value);
+ }
+
+ mAttr = mAttr.NextMatch();
+ }
+ return dict;
+ }
+
+ static string EscapeContentForAdocTableCell(string s)
+ {
+ // Replace (string input, string replacement);
+ s = rxTag.Replace(s, ""); // HTML蜈ィ闊ャ縺ョ繧ソ繧ー繧呈カ亥悉
+ s = s.Replace("\r\n", " ")
+ .Replace("\n", " ")
+ .Replace("\r", " ")
+ .Replace("\t", " ")
+ .Replace(" ", " ")
+ .Replace("<", "<")
+ .Replace(">", ">")
+ .Replace("&", "&")
+ .Replace("|", "{VBar}"); // ADoc逕ィ
+ return s;
+ }
+
+ static string ParseTableToAdoc(string tableText, Dictionary> classFormat)
+ {
+ var sb = new StringBuilder();
+ Match m = rxTag.Match(tableText);
+ string lastStartTag = null;
+ int lastPos = -1;
+ int lastTdPos = -1;
+ int currentTdCount = 0;
+ int maxTdCount = 0;
+
+ sb.AppendLine("|===");
+
+ while (m.Success)
+ {
+ if (m.Groups[1].Length > 0)
+ {
+ string tag = m.Groups[1].Value;
+ string attrsStr = m.Groups[2].Value;
+ lastPos = m.Groups[0].Index + m.Groups[0].Length;
+
+ if (tag == "tr")
+ {
+ maxTdCount = Math.Max(maxTdCount, currentTdCount);
+ currentTdCount = 0;
+ }
+ else if (tag == "td")
+ {
+ lastTdPos = lastPos;
+ if (lastStartTag != "tr")
+ {
+ sb.Append(" ");
+ }
+ var attrs = ParseAttrs(attrsStr);
+ if (attrs.ContainsKey("colspan") || attrs.ContainsKey("rowspan"))
+ {
+ if (attrs.ContainsKey("colspan"))
+ {
+ sb.Append(attrs["colspan"]);
+ currentTdCount = currentTdCount + int.Parse(attrs["colspan"])-1;
+ }
+ if (attrs.ContainsKey("rowspan"))
+ {
+ sb.Append(".");
+ sb.Append(attrs["rowspan"]);
+ }
+ sb.Append("+");
+ }
+ if (attrs.ContainsKey("class"))
+ {
+ var format = classFormat["default"];
+ string classid = attrs["class"];
+ if (classFormat.ContainsKey(classid)){
+ format = classFormat[classid];
+ }
+ sb.Append(format["text-align"].Replace("general", "<").Replace("left", "<").Replace("center", "^").Replace("right", ">"));
+ sb.Append(".");
+ sb.Append(format["vertical-align"].Replace("general", "<").Replace("top", "<").Replace("middle", "^").Replace("bottom", ">"));
+ }
+ else
+ {
+ var format = classFormat["default"];
+ sb.Append(format["text-align"].Replace("general", "<").Replace("left", "<").Replace("center", "^").Replace("right", ">"));
+ sb.Append(".");
+ sb.Append(format["vertical-align"].Replace("general", "<").Replace("top", "<").Replace("middle", "^").Replace("bottom", ">"));
+ }
+ sb.Append("|");
+ currentTdCount++;
+ }
+ lastStartTag = tag;
+ }
+ else if (m.Groups[3].Length > 0)
+ {
+ string tag = m.Groups[3].Value;
+ int tagStartPos = m.Groups[0].Index;
+ //Console.WriteLine("" + m.Groups[3].Value +">");
+ if (tag == "tr")
+ {
+ sb.AppendLine("");
+ }
+ else if (tag == "td")
+ {
+ string s = tableText.Substring(lastTdPos, tagStartPos - lastTdPos);
+ sb.Append(EscapeContentForAdocTableCell(s));
+ lastTdPos = -1;
+ }
+ lastPos = -1;
+ lastStartTag = null;
+ }
+
+ m = m.NextMatch();
+ }
+
+ sb.AppendLine("|===");
+
+ //謨エ蠖「
+ sb = sb.Replace("<.<", "");
+ string firstLine = "[cols=\"<.> classFormat = GetFormat(styleText);
+ string tableText = GetFirstTableText(htmlText, pos);
+ return ParseTableToAdoc(tableText, classFormat);
+ }
+
+ static Dictionary> GetFormat(string styleText)
+ {
+ int maxFormatNum = 100;
+ int counter = 0;
+ int endPos = 0;
+ Regex reg = new Regex(@"[\t {};]");
+
+ // 繝繝輔か繝ォ繝亥、縺ョ繝繝輔か繝ォ繝亥、
+ var dctDefault = new Dictionary();
+ dctDefault.Add("color", "black");
+ dctDefault.Add("background", "black");
+ dctDefault.Add("text-align", "left");
+ dctDefault.Add("vertical-align", "top");
+
+ // 繝繝輔か繝ォ繝亥、蜿門セ
+ int startTdTagPos = styleText.IndexOf("td\r\n\t{", 0);
+ int endTdTagPos = styleText.IndexOf(";}", startTdTagPos);
+ string defauletFromatText= styleText.Substring(startTdTagPos, endTdTagPos + ";}".Length-startTdTagPos);
+ var defaultLines = reg.Replace(defauletFromatText, "").Replace("\r\n", "\n").Split(new[] { '\n', '\r' });
+ foreach (string line in defaultLines)
+ {
+ string[] words = line.Split(':');
+ if (dctDefault.ContainsKey(words[0]))
+ {
+ dctDefault[words[0]] = words[1];
+ }
+ }
+
+ var ret = new Dictionary>();
+ ret.Add("default", dctDefault);
+
+ // 蜷繧ッ繝ゥ繧ケ縺ョ譖ク蠑上r蜿門セ
+ while (counter < maxFormatNum)
+ {
+ counter++;
+
+ int formatStartTagPos = styleText.IndexOf(".xl", endPos);
+ if (formatStartTagPos < 0)
+ {
+ break;
+ }
+ formatStartTagPos += ".xl".Length;
+
+ int formatEndTagPos = styleText.IndexOf(";}", formatStartTagPos);
+ if (formatEndTagPos < 0)
+ {
+ break;
+ }
+ endPos = formatEndTagPos + ";}".Length;
+
+ string formatText = styleText.Substring(formatStartTagPos, endPos - formatStartTagPos);
+ var lines = reg.Replace(formatText, "").Replace("\r\n", "\n").Split(new[] { '\n', '\r' });
+
+ string classid = "xl" + lines[0];
+ var dctFormat = new Dictionary();
+ dctFormat.Add("color", dctDefault["color"]);
+ dctFormat.Add("background", dctDefault["background"]);
+ dctFormat.Add("text-align", dctDefault["text-align"]);
+ dctFormat.Add("vertical-align", dctDefault["vertical-align"]);
+
+ foreach (string line in lines)
+ {
+ string[] words = line.Split(':');
+ if (dctFormat.ContainsKey(words[0]))
+ {
+ dctFormat[words[0]] = words[1];
+ }
+ }
+ ret.Add(classid, dctFormat);
+ }
+ return ret;
+ }
+
+ [STAThread]
+ static void Main(string[] args)
+ {
+ Application.Run(new SampleForm());
+ }
+
+ private void InitializeComponent()
+ {
+ this.SuspendLayout();
+ //
+ // SampleForm
+ //
+ this.ClientSize = new System.Drawing.Size(284, 261);
+ this.Name = "SampleForm";
+ this.Load += new System.EventHandler(this.SampleForm_Load);
+ this.ResumeLayout(false);
+
+ }
+
+ private void SampleForm_Load(object sender, EventArgs e)
+ {
+
+ }
+}
\ No newline at end of file
diff --git a/Tool/ExcelToAdocConverter/source/EcxelToAdocConverter/ExcelToAdocConverter.resx b/Tool/ExcelToAdocConverter/source/EcxelToAdocConverter/ExcelToAdocConverter.resx
new file mode 100644
index 0000000000000000000000000000000000000000..29dcb1b3a353ba227f65e11fbe3d6f0766e84292
--- /dev/null
+++ b/Tool/ExcelToAdocConverter/source/EcxelToAdocConverter/ExcelToAdocConverter.resx
@@ -0,0 +1,120 @@
+サソ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/Tool/ExcelToAdocConverter/source/EcxelToAdocConverter/Properties/AssemblyInfo.cs b/Tool/ExcelToAdocConverter/source/EcxelToAdocConverter/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000000000000000000000000000000000000..864bbc601c1ce9bcf1777bca01d871614a30bb22
--- /dev/null
+++ b/Tool/ExcelToAdocConverter/source/EcxelToAdocConverter/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+サソusing System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 繧「繧サ繝ウ繝悶Μ縺ォ髢「縺吶k荳闊ャ諠蝣ア縺ッ莉・荳九ョ螻樊ァ繧サ繝繝医r縺ィ縺翫@縺ヲ蛻カ蠕。縺輔l縺セ縺吶
+// 繧「繧サ繝ウ繝悶Μ縺ォ髢「騾」莉倥¢繧峨l縺ヲ縺繧区ュ蝣ア繧貞、画峩縺吶k縺ォ縺ッ縲
+// 縺薙l繧峨ョ螻樊ァ蛟、繧貞、画峩縺励※縺上□縺輔>縲
+[assembly: AssemblyTitle("EcxelToAdocConverter")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("EcxelToAdocConverter")]
+[assembly: AssemblyCopyright("Copyright ツゥ 2021")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// ComVisible 繧 false 縺ォ險ュ螳壹☆繧九→縲√%縺ョ繧「繧サ繝ウ繝悶Μ蜀縺ョ蝙九ッ COM 繧ウ繝ウ繝昴シ繝阪Φ繝医°繧
+// 蜿らァ縺ァ縺阪↑縺上↑繧翫∪縺吶COM 縺九i縺薙ョ繧「繧サ繝ウ繝悶Μ蜀縺ョ蝙九↓繧「繧ッ繧サ繧ケ縺吶k蠢隕√′縺ゅk蝣エ蜷医ッ縲
+// 縺昴ョ蝙九ョ ComVisible 螻樊ァ繧 true 縺ォ險ュ螳壹@縺ヲ縺上□縺輔>縲
+[assembly: ComVisible(false)]
+
+// 縺薙ョ繝励Ο繧ク繧ァ繧ッ繝医′ COM 縺ォ蜈ャ髢九&繧後k蝣エ蜷医∵ャ。縺ョ GUID 縺 typelib 縺ョ ID 縺ォ縺ェ繧翫∪縺
+[assembly: Guid("36aa7526-71ef-4009-b21e-55a0ff4cfa12")]
+
+// 繧「繧サ繝ウ繝悶Μ縺ョ繝舌シ繧ク繝ァ繝ウ諠蝣ア縺ッ谺。縺ョ 4 縺、縺ョ蛟、縺ァ讒区舌&繧後※縺縺セ縺:
+//
+// 繝。繧ク繝」繝シ 繝舌シ繧ク繝ァ繝ウ
+// 繝槭う繝翫シ 繝舌シ繧ク繝ァ繝ウ
+// 繝薙Ν繝臥分蜿キ
+// Revision
+//
+// 縺吶∋縺ヲ縺ョ蛟、繧呈欠螳壹☆繧九°縲∵ャ。繧剃スソ逕ィ縺励※繝薙Ν繝臥分蜿キ縺ィ繝ェ繝薙ず繝ァ繝ウ逡ェ蜿キ繧呈里螳壹↓險ュ螳壹〒縺阪∪縺
+// 譌「螳壼、縺ォ縺吶k縺薙→縺後〒縺阪∪縺:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]