كيف يمكنني استخدام التنسيقات المحددة مسبقًا في DOCX مع POI؟
-
27-09-2019 - |
سؤال
أقوم بإنشاء مولد DOCX مع POI وأرغب في استخدام التنسيقات المحددة مسبقًا.
تتضمن Word عدة تنسيقات مثل العنوان ، والرابط 1..10 إلخ. هذه التنسيقات محددة مسبقًا في كل docx تقوم بإنشائها باستخدام Word.
أود استخدامها في مولد DOCX الخاص بي. جربت ما يلي ولكن لم يتم تطبيق التنسيق:
paragraph = document.createParagraph();
lastParagraph.setStyle("Heading1");
لقد حاولت أيضًا "Heading 1" و "Heading1" و "Heading1" كأسلوب ، لكن لم يعمل أي منهم.
ال وثائق API لا تظهر أي تفاصيل.
لقد قمت بتحليل ملف DOCX الذي تم إنشاؤه باستخدام Word 2007 واكتشفت أن "Heading1" سيكون صحيحًا. لسوء الحظ ، لا يتم تعريف النمط في DOCX. هل يجب علي إنشاء هذا النمط يدويًا؟
هل يمكن لأي شخص أن يوجهني إلى الحل الصحيح؟
المحلول
الأمر بسيط للغاية: استخدم ملف DOCX "قالب".
- قم بإنشاء ملف DOCX فارغ مع Word 2007.
- استخدم هذا الملف كقالب لك
XWPFDocument
- أضف فقراتك مع الأنماط.
هذا هو الرمز:
XWPFDocument document = new XWPFDocument(new FileInputStream("template.docx");
paragraph = document.createParagraph();
paragraph.setStyle("Heading1");
يحتوي القالب على جميع الأنماط وبالتالي يمكن الإشارة إليه عبر setStyle("Heading1");
.
نصائح أخرى
يمكنك إنشاء قالب كلمة (فقط استخدم ميزة Save As ... في Word).
الخيار الأول
يحتوي القالب الآن على عدد من ملفات XML إضافية في كلمة المجلد: - Styles.xml - STYLESWITHEFFECTS.XML - WebSettings.xml - fonttable.xml و A - theme Folder
إذا قمت بنسخ هذه الملفات إلى ملف POI الأصلي الذي تم إنشاؤه ، فيمكنك الرجوع إلى الأنماط الواردة في Styles.xml ملف.
يمكنك معالجة ملفك الأصلي مثل ملف zip ، ولا ينبغي أن يكون هذا لجهد كبير.
الخيار الثاني
نسخ أنماط في الكود من القالب إلى المستند الخاص بك:
XWPFDocument template = new XWPFDocument(new FileInputStream(new File("Template.dotx")));
XWPFDocument doc = new XWPFDocument();
// let's copy styles from template to new doc
XWPFStyles newStyles = doc.createStyles();
newStyles.setStyles(template.getStyle());
XWPFParagraph para = doc.createParagraph();
para.setStyle("Heading1");
XWPFRun run = para.createRun();
run.setText("Heading 1");
return doc;
على الجانب الإيجابي ، يمكنك معالجة أنماطك بشكل منفصل مباشرة باستخدام Word وحفظها مرة أخرى إلى ملف القالب.
إذا كنت مهتمًا بشكل عام بإنشاء نمط يتم التعرف عليه كعنصر من المستوى 1 (على سبيل المثال ، للاستخدام في TOC المولدة من Word) ويمكن الوصول إليه في شريط تنسيقات الكلمات ، يمكن القيام به مثل هذا:
private static File writeSimpleDocxFile(String content) throws IOException {
XWPFDocument docxDocument = new XWPFDocument();
String strStyleId = "ownstyle1";
addCustomHeadingStyle(docxDocument, strStyleId, 1);
XWPFParagraph paragraph = docxDocument.createParagraph();
XWPFRun run = paragraph.createRun();
run.setText(content);
paragraph.setStyle(strStyleId);
}
private static void addCustomHeadingStyle(XWPFDocument docxDocument, String strStyleId, int headingLevel) {
CTStyle ctStyle = CTStyle.Factory.newInstance();
ctStyle.setStyleId(strStyleId);
CTString styleName = CTString.Factory.newInstance();
styleName.setVal(strStyleId);
ctStyle.setName(styleName);
CTDecimalNumber indentNumber = CTDecimalNumber.Factory.newInstance();
indentNumber.setVal(BigInteger.valueOf(headingLevel));
// lower number > style is more prominent in the formats bar
ctStyle.setUiPriority(indentNumber);
CTOnOff onoffnull = CTOnOff.Factory.newInstance();
ctStyle.setUnhideWhenUsed(onoffnull);
// style shows up in the formats bar
ctStyle.setQFormat(onoffnull);
// style defines a heading of the given level
CTPPr ppr = CTPPr.Factory.newInstance();
ppr.setOutlineLvl(indentNumber);
ctStyle.setPPr(ppr);
XWPFStyle style = new XWPFStyle(ctStyle);
// is a null op if already defined
XWPFStyles styles = docxDocument.createStyles();
style.setType(STStyleType.PARAGRAPH);
styles.addStyle(style);
}
نعم ، سيظهر هذا النمط في Styles.xml.
(أعرف: هذه ليست إجابة مباشرة على سؤالك ، لكنني لم أجد هذه المعلومات على الإنترنت في شكل قابل للاستخدام ، سأقوم بنشرها هنا)
نعم ، يجب أن تفعل ذلك يدويًا. يقول Docx Spec أن Styles.xml التي تحتوي على معلومات حول الأنماط اختيارية. لذلك ، أنا متأكد تقريبًا من أن POI لا ينشئه على الإطلاق إذا لم تفعل ذلك بشكل واضح. يمكنك التحقق من ذلك: فقط قم بإلغاء ضغط ملف DOCX وإلقاء نظرة على ما إذا كان هذا الملف موجودًا أم لا (yourfile.docx/word/styles.xml).
لذا ، ما يجب عليك فعله (من حيث Docx ، لا أعرف كيف يتم تنفيذ ذلك في POI):
1) إنشاء أنماط. xml وأضف الأنماط اللازمة هناك
2) إنشاء علاقة تربط document.xml و styles.xml (أعتقد أن POI يجب أن تفعل ذلك تلقائيًا)
3) استخدم معرفات الأنماط داخل document.xml لتوصيل جزء النص الخرساني (تشغيل بمصطلحات DOCX) بأسلوب ملموس.