;============================================================ ; iron_docx_net.hsp — Word DOCX (OpenXML SDK 版) ; ; DocumentFormat.OpenXml を使って Word .docx を Office 不要で ; 読み書きする。テンプレ差し込み (string replace) を含む。 ; ; 前提: ; DocumentFormat.OpenXml.dll が GAC or 実行フォルダにあること。 ; ; API: ; docxn_open "path.docx" 既存 .docx オープン ; docxn_create "path.docx" 空 .docx を新規作成 ; docxn_get_text var_out 全パラグラフを連結取得 ; docxn_append_paragraph "text" 末尾に段落追加 ; docxn_append_heading "text", level 見出し追加 (1〜6) ; docxn_append_styled "text", bold, italic, size_pt, "色HEX" ; docxn_append_image "path.png", width_px, height_px 画像挿入 ; docxn_append_table rows, cols, "csv_data" CSV をそのまま Table に ; docxn_replace "old", "new" 全文字列置換 (テンプレ差込) ; docxn_save 上書き保存 ; docxn_close ; ; 依存アセンブリ: DocumentFormat.OpenXml.dll / WindowsBase.dll ;============================================================ #ifndef __iron_docx_net_hsp__ #define __iron_docx_net_hsp__ #module iron_docx_net dim _docxn_cs_loaded, 1 #deffunc _docxn_load_cs if _docxn_cs_loaded : return sdim _cs, 16384 _cs = {" using System; using System.IO; using System.Linq; using System.Text; using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; public class HspDocxNet { static WordprocessingDocument doc = null; public static string Open(string path) { try { Close(); doc = WordprocessingDocument.Open(path, true); return \"0\"; } catch (Exception e) { return \"-1\\t\" + e.Message; } } public static string Create(string path) { try { Close(); doc = WordprocessingDocument.Create(path, WordprocessingDocumentType.Document); var main = doc.AddMainDocumentPart(); main.Document = new Document(new Body()); main.Document.Save(); return \"0\"; } catch (Exception e) { return \"-1\\t\" + e.Message; } } public static string GetText() { if (doc == null) return \"\"; var body = doc.MainDocumentPart.Document.Body; var sb = new StringBuilder(); foreach (var p in body.Descendants()) { foreach (var t in p.Descendants()) sb.Append(t.Text); sb.Append('\\n'); } return sb.ToString(); } public static string AppendParagraph(string text) { if (doc == null) return \"-1\"; var body = doc.MainDocumentPart.Document.Body; var p = new Paragraph(new Run(new Text(text))); body.Append(p); doc.MainDocumentPart.Document.Save(); return \"0\"; } public static string AppendHeading(string text, int level) { if (doc == null) return \"-1\"; if (level < 1) level = 1; if (level > 6) level = 6; var body = doc.MainDocumentPart.Document.Body; var pp = new ParagraphProperties(new ParagraphStyleId() { Val = \"Heading\" + level }); var p = new Paragraph(pp, new Run(new Text(text))); body.Append(p); doc.MainDocumentPart.Document.Save(); return \"0\"; } public static string AppendStyled(string text, int bold, int italic, int sizePt, string colorHex) { if (doc == null) return \"-1\"; var body = doc.MainDocumentPart.Document.Body; var rPr = new RunProperties(); if (bold != 0) rPr.Append(new Bold()); if (italic != 0) rPr.Append(new Italic()); if (sizePt > 0) rPr.Append(new FontSize() { Val = (sizePt * 2).ToString() }); if (!string.IsNullOrEmpty(colorHex)) rPr.Append(new Color() { Val = colorHex.TrimStart('#') }); var run = new Run(rPr, new Text(text)); body.Append(new Paragraph(run)); doc.MainDocumentPart.Document.Save(); return \"0\"; } public static string AppendImage(string imagePath, int widthPx, int heightPx) { if (doc == null) return \"-1\"; try { var main = doc.MainDocumentPart; var imgExt = System.IO.Path.GetExtension(imagePath).ToLower(); ImagePartType t = ImagePartType.Png; if (imgExt == \".jpg\" || imgExt == \".jpeg\") t = ImagePartType.Jpeg; else if (imgExt == \".gif\") t = ImagePartType.Gif; else if (imgExt == \".bmp\") t = ImagePartType.Bmp; var imgPart = main.AddImagePart(t); using (var fs = new System.IO.FileStream(imagePath, System.IO.FileMode.Open)) imgPart.FeedData(fs); string relId = main.GetIdOfPart(imgPart); long cx = widthPx * 9525L; // EMU per pixel (96 DPI) long cy = heightPx * 9525L; // Minimal image run (inline drawing) — use a safe XML template string xml = \"\" + \"\" + \"\" + \"\" + \"\" + \"\" + \"\" + \"\" + \"\" + \"\" + \"\" + \"\" + \"\" + \"\" + \"\" + \"\" + \"\"; var body = main.Document.Body; var newP = new Paragraph(); newP.InnerXml = xml; body.Append(newP); main.Document.Save(); return \"0\"; } catch (Exception e) { return \"-1\\t\" + e.Message; } } public static string AppendTable(int rows, int cols, string csvData) { if (doc == null) return \"-1\"; var body = doc.MainDocumentPart.Document.Body; var tbl = new Table(); var tblProps = new TableProperties( new TableBorders( new TopBorder() { Val = BorderValues.Single, Size = 4 }, new BottomBorder() { Val = BorderValues.Single, Size = 4 }, new LeftBorder() { Val = BorderValues.Single, Size = 4 }, new RightBorder() { Val = BorderValues.Single, Size = 4 }, new InsideHorizontalBorder() { Val = BorderValues.Single, Size = 4 }, new InsideVerticalBorder() { Val = BorderValues.Single, Size = 4 } )); tbl.Append(tblProps); string[] lines = (csvData ?? \"\").Split('\\n'); for (int r = 0; r < rows; r++) { var row = new TableRow(); string[] cells = r < lines.Length ? lines[r].TrimEnd('\\r').Split(',') : new string[0]; for (int c = 0; c < cols; c++) { string val = c < cells.Length ? cells[c] : \"\"; var tc = new TableCell(new Paragraph(new Run(new Text(val)))); row.Append(tc); } tbl.Append(row); } body.Append(tbl); doc.MainDocumentPart.Document.Save(); return \"0\"; } public static string Replace(string oldText, string newText) { if (doc == null) return \"-1\"; int n = 0; foreach (var t in doc.MainDocumentPart.Document.Body.Descendants()) { if (t.Text.Contains(oldText)) { t.Text = t.Text.Replace(oldText, newText); n++; } } doc.MainDocumentPart.Document.Save(); return n.ToString(); } public static string Save() { if (doc == null) return \"-1\"; doc.MainDocumentPart.Document.Save(); return \"0\"; } public static string Close() { if (doc != null) { doc.Dispose(); doc = null; } return \"0\"; } } "} loadnet _cs, 3, "DocumentFormat.OpenXml.dll", "WindowsBase.dll" _docxn_cs_loaded = 1 return #deffunc docxn_open str path, \ local _h, local _r _docxn_load_cs newnet _h, "HspDocxNet" mcall _h, "Open", _r, path return int("" + _r) #deffunc docxn_create str path, \ local _h, local _r _docxn_load_cs newnet _h, "HspDocxNet" mcall _h, "Create", _r, path return int("" + _r) #deffunc docxn_get_text var v_out, \ local _h, local _r sdim v_out, 65536 _docxn_load_cs newnet _h, "HspDocxNet" mcall _h, "GetText", _r v_out = "" + _r return 0 #deffunc docxn_append_paragraph str text, \ local _h, local _r _docxn_load_cs newnet _h, "HspDocxNet" mcall _h, "AppendParagraph", _r, text return int("" + _r) #deffunc docxn_append_heading str text, int level, \ local _h, local _r _docxn_load_cs newnet _h, "HspDocxNet" mcall _h, "AppendHeading", _r, text, level return int("" + _r) #deffunc docxn_append_styled str text, int bold, int italic, int size_pt, str color_hex, \ local _h, local _r _docxn_load_cs newnet _h, "HspDocxNet" mcall _h, "AppendStyled", _r, text, bold, italic, size_pt, color_hex return int("" + _r) #deffunc docxn_append_image str path, int width_px, int height_px, \ local _h, local _r _docxn_load_cs newnet _h, "HspDocxNet" mcall _h, "AppendImage", _r, path, width_px, height_px return int("" + _r) #deffunc docxn_append_table int rows, int cols, str csv_data, \ local _h, local _r _docxn_load_cs newnet _h, "HspDocxNet" mcall _h, "AppendTable", _r, rows, cols, csv_data return int("" + _r) #deffunc docxn_replace str old_text, str new_text, \ local _h, local _r _docxn_load_cs newnet _h, "HspDocxNet" mcall _h, "Replace", _r, old_text, new_text return int("" + _r) #deffunc docxn_save \ local _h, local _r _docxn_load_cs newnet _h, "HspDocxNet" mcall _h, "Save", _r return int("" + _r) #deffunc docxn_close \ local _h, local _r _docxn_load_cs newnet _h, "HspDocxNet" mcall _h, "Close", _r return 0 #global #endif