poi对于word文本的底纹和下划线的样式的展现



1 package poi.test;
  2 import java.io.FileOutputStream;
  3 import java.math.BigInteger;
  4 import java.util.Random;
  5 
  6 import org.apache.poi.xwpf.usermodel.BreakType;
  7 import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
  8 import org.apache.poi.xwpf.usermodel.TextAlignment;
  9 import org.apache.poi.xwpf.usermodel.XWPFDocument;
 10 import org.apache.poi.xwpf.usermodel.XWPFParagraph;
 11 import org.apache.poi.xwpf.usermodel.XWPFRun;
 12 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFonts;
 13 //import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHighlight;
 14 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHpsMeasure;
 15 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr;
 16 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr;
 17 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTShd;
 18 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSpacing;
 19 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTUnderline;
 20 //import org.openxmlformats.schemas.wordprocessingml.x2006.main.STHighlightColor;
 21 import org.openxmlformats.schemas.wordprocessingml.x2006.main.STLineSpacingRule;
 22 import org.openxmlformats.schemas.wordprocessingml.x2006.main.STShd;
 23 import org.openxmlformats.schemas.wordprocessingml.x2006.main.STUnderline;
 24 
 25 public class StyleTest2 {
 26     public static void main(String[] args) throws Exception {
 27         StyleTest2 t = new StyleTest2();
 28         XWPFDocument doc = new XWPFDocument();
 29         // 需关闭护眼色才能看到效果
 30         //t.setDocumentbackground(doc, "FDE9D9");//设置页面背景色
 31         t.testSetUnderLineStyle(doc);//设置下划线样式以及突出显示文本
 32         t.addNewPage(doc, BreakType.PAGE);
 33         t.testSetShdStyle(doc);//设置文字底纹
 34         t.saveDocument(doc,"e:/"+ System.currentTimeMillis() + ".docx");
 35     }
 36 
 37     public void testSetUnderLineStyle(XWPFDocument doc) {
 38         String[] colors = new String[] { "CCA6EF", "DD999D", "4FCEF0",
 39                 "7A7A7A", "F3C917", "FFA932", "C7B571", "535354", "5FD2F1",
 40                 "B5E900", "FEF8B6" };
 41         Random random = new Random();
 42         // 这里为了方便测试写了数字,推荐写英文样式
 43         for (int i = 1; i <= 18; i++) {
 44             XWPFParagraph p = doc.createParagraph();
 45             setParagraphFontInfoAndUnderLineStyle(p, 
 46                     "本文是以poi3.9读写2010word、2010excel、2010ppt", "华文行楷", "000000","22", 
 47                     false, false, false, true, 
 48                     i,colors[Math.abs(random.nextInt(colors.length))], false, 0,null);
 49             setParagraphSpacingInfo(p, true, "0", "50", false, "0", "0", 
 50                     true,"240", STLineSpacingRule.Enum.forString("auto"));
 51             setParagraphAlignInfo(p, ParagraphAlignment.LEFT,TextAlignment.CENTER);
 52         }
 53     }
 54 
 55     public void testSetShdStyle(XWPFDocument doc) {
 56         String[] colors = new String[] { "CCA6EF", "DD999D", "4FCEF0",
 57                 "7A7A7A", "F3C917", "FFA932", "C7B571", "535354", "5FD2F1",
 58                 "B5E900", "FEF8B6" };
 59         Random random = new Random();
 60         // 这里为了方便测试写了数字,推荐写英文样式
 61         for (int i = 1; i <= 38; i++) {
 62             XWPFParagraph p = doc.createParagraph();
 63             setParagraphFontInfoAndUnderLineStyle(p, 
 64                     "本文是以poi3.9读写2010word、2010excel、2010ppt", "华文行楷", "1D8C56","22",
 65                     false, false, false, false, 
 66                     i, null, true, i,colors[Math.abs(random.nextInt(colors.length))]);
 67             setParagraphSpacingInfo(p, true, "0", "50", false, "0", "0", 
 68                     true,"240", STLineSpacingRule.Enum.forString("auto"));
 69             setParagraphAlignInfo(p, ParagraphAlignment.LEFT,TextAlignment.CENTER);
 70         }
 71     }
 72     
 73     //设定水平对齐方式、垂直对齐方式
 74     public void setParagraphAlignInfo(XWPFParagraph p,
 75             ParagraphAlignment pAlign, TextAlignment valign) {
 76         p.setAlignment(pAlign);
 77         p.setVerticalAlignment(valign);
 78     }
 79 
 80     //三组数,分别设定  ★段前段后磅数★段前段后行数★间距★
 81     public void setParagraphSpacingInfo(XWPFParagraph p, boolean isSpace,String before, String after, 
 82             boolean isPLine, String beforeLines,String afterLines, 
 83             boolean isLine, String line,STLineSpacingRule.Enum lineValue) {
 84         CTPPr pPPr = null;
 85         if (p.getCTP() != null) {
 86             if (p.getCTP().getPPr() != null) {
 87                 pPPr = p.getCTP().getPPr();
 88             } else {
 89                 pPPr = p.getCTP().addNewPPr();
 90             }
 91         }
 92         /**
 93          * CTSpacing设置段落
 94          */
 95         CTSpacing pSpacing = pPPr.getSpacing() != null ? pPPr.getSpacing()
 96                 : pPPr.addNewSpacing();
 97         if (isSpace) {
 98             // 段前磅数
 99             if (before != null) {
100                 pSpacing.setBefore(new BigInteger(before));
101             }
102             // 段后磅数
103             if (after != null) {
104                 pSpacing.setAfter(new BigInteger(after));
105             }
106         }
107         if (isPLine) {
108             // 段前行数
109             if (beforeLines != null) {
110                 pSpacing.setBeforeLines(new BigInteger(beforeLines));
111             }
112             // 段后行数
113             if (afterLines != null) {
114                 pSpacing.setAfterLines(new BigInteger(afterLines));
115             }
116         }
117         // 间距
118         if (isLine) {
119             if (line != null) {
120                 pSpacing.setLine(new BigInteger(line));
121             }
122             if (lineValue != null) {
123                 pSpacing.setLineRule(lineValue);
124             }
125         }
126     }
127 
128     @SuppressWarnings("deprecation")
129     public void setParagraphFontInfoAndUnderLineStyle(XWPFParagraph p,
130             String content, String fontFamily, String colorVal,String fontSize, 
131             boolean isBlod, boolean isItalic,boolean isStrike, boolean isUnderLine, 
132             int underLineStyle,String underLineColor, boolean isShd, int shdValue, String shdColor) {
133         XWPFRun pRun = null;
134         if (p.getRuns() != null && p.getRuns().size() > 0) {
135             pRun = p.getRuns().get(0);
136         } else {
137             pRun = p.createRun();
138         }
139         pRun.setText(content);
140 /**
141  * CTRPr设置页
142  */
143         CTRPr pRpr = null;
144         if (pRun.getCTR() != null) {
145             pRpr = pRun.getCTR().getRPr();
146             if (pRpr == null) {
147                 pRpr = pRun.getCTR().addNewRPr();
148             }
149         }
150 /**
151  * CTFonts设置字体
152  */
153         // 设置字体
154         CTFonts fonts = pRpr.isSetRFonts() ? pRpr.getRFonts() : pRpr
155                 .addNewRFonts();
156         fonts.setAscii(fontFamily);//---只改变Ascii中的(字母和数字)
157         fonts.setEastAsia(fontFamily);//---只改变中文EastAsia
158         fonts.setHAnsi(fontFamily);//---
159 
160         /**
161          * CTHpsMeasure设置大小
162          */
163         // 设置字体大小
164         CTHpsMeasure sz = pRpr.isSetSz() ? pRpr.getSz() : pRpr.addNewSz();
165         sz.setVal(new BigInteger(fontSize));
166 
167         CTHpsMeasure szCs = pRpr.isSetSzCs() ? pRpr.getSzCs() : pRpr
168                 .addNewSzCs();
169         szCs.setVal(new BigInteger(fontSize));//---字体大小
170 
171         // 设置字体样式
172         if (isBlod) {
173             pRun.setBold(isBlod);//---是否加黑加粗
174         }
175         if (isItalic) {
176             pRun.setItalic(isItalic);//---是否倾斜
177         }
178         if (isStrike) {
179             pRun.setStrike(isStrike);//是否有中划线
180         }
181         if (colorVal != null) {
182             pRun.setColor(colorVal);//---字体颜色1D8C56
183         }
184 
185 //        // 设置字突出显示文本---设置的文字的背景颜色,太难看了!!
186 //        if (underLineStyle > 0 && underLineStyle < 17) {
187 //            CTHighlight hightLight = pRpr.isSetHighlight() ? pRpr
188 //                    .getHighlight() : pRpr.addNewHighlight();
189 //            hightLight.setVal(STHighlightColor.Enum.forInt(underLineStyle));
190 //        }
191 //
192         // 设置下划线样式
193         if (isUnderLine) {
194             CTUnderline u = pRpr.isSetU() ? pRpr.getU() : pRpr.addNewU();
195             u.setVal(STUnderline.Enum.forInt(Math.abs(underLineStyle % 19)));
196             if (underLineColor != null) {
197                 u.setColor(underLineColor);
198             }
199         }
200 /**
201  * CTShd设置底纹
202  */
203         if (isShd) {
204             // 设置底纹
205             CTShd shd = pRpr.isSetShd() ? pRpr.getShd() : pRpr.addNewShd();
206             if (shdValue > 0 && shdValue <= 38) {
207                 shd.setVal(STShd.Enum.forInt(underLineStyle));
208             }
209             if (shdColor != null) {
210                 shd.setColor(shdColor);
211             }
212         }
213     }
214 
215 //    // 设置页面背景色
216 //    public void setDocumentbackground(XWPFDocument document, String bgColor) {
217 //        CTBackground bg = null;
218 //        if( document.getDocument().isSetBackground()){
219 //            bg = document.getDocument().getBackground();
220 //        }else{
221 //            bg = document.getDocument().addNewBackground();
222 //            }
223 //          bg.setColor(bgColor);
224 //    }
225 
226     public void addNewPage(XWPFDocument document, BreakType breakType) {
227         XWPFParagraph xp = document.createParagraph();
228         xp.createRun().addBreak(breakType);
229     }
230 
231     public void saveDocument(XWPFDocument document, String savePath)
232             throws Exception {
233         FileOutputStream fos = new FileOutputStream(savePath);
234         document.write(fos);
235         fos.close();
236     }
237 }