كيف يمكنني استخدام التنسيقات المحددة مسبقًا في DOCX مع POI؟

StackOverflow https://stackoverflow.com/questions/2643822

  •  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 "قالب".

  1. قم بإنشاء ملف DOCX فارغ مع Word 2007.
  2. استخدم هذا الملف كقالب لك XWPFDocument
  3. أضف فقراتك مع الأنماط.

هذا هو الرمز:

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) بأسلوب ملموس.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top