spring boot实现自动输出word文档功能的实例代码

网友投稿 308 2022-10-28


spring boot实现自动输出word文档功能的实例代码

spring boot实现自动输出word文档功能

本文用到Apache POI组件

组件依赖在pom.xml文件中添加

org.apache.poi

poi

4.1.0

org.apache.poi

poi-ooxml

4.1.0

首先创建相关的实体类、编写需要用到的sql查询。

import lombok.Data;

// 选择题实体

@Data

public class MultiQuestion {

private Integer questionId;

private String subject;

private String section;

private String answerA;

private String answerB;

private String answerC;

private String answerD;

private String question;

private String level;

private String rightAnswer;

private String analysis; //题目解析

private Integer score;

}

import lombok.Data;

//填空题实体类

@Data

public class FillQuestion {

private Integer questionId;

private String subject;

private String question;

private String answer;

private Integer score;

private String level;

private String section;

private String analysis; //题目解析

}

import lombok.Data;

//判断题实体类

@Data

public class JudgeQuestion {

private Integer questionId;

private String subject;

private String question;

private String answer;

private String level;

private String section;

private Integer score;

private String analysis; //题目解析

}

创建好要用到的实体类之后,利用mybatis写sql查询,可以分为两种:1、配置mapper.xml文件路径,在xml文件中编写sql语句。2、直接使用注解。本文使用方法为第二种。

@Mapper

public interface MultiQuestionMapper {

/**

* select * from multiquestions where questionId in (

* select questionId from papermanage where questionType = 1 and paperId = 1001

* )

*/

@Select("select * from multi_question where questionId in (select questionId from paper_manage where questionType = 1 and paperId = #{paperId})")

List findByIdAndType(Integer PaperId);

@Select("select * from multi_question")

IPage findAll(Page page);

/**

* 查询最后一条记录的questionId

* @return MultiQuestion

*/

@Select("select questionId from multi_question order by questionId desc limit 1")

MultiQuestion findOnlyQuestionId();

@Options(useGeneratedKeys = true,keyProperty = "questionId")

@Insert("insert into multi_question(subject,question,answerA,answerB,answerC,answerD,rightAnswer,analysis,section,level) " +

"values(#{subject},#{question},#{answerA},#{answerB},#{answerC},#{answerD},#{rightAnswer},#{analysis},#{section},#{level})")

int add(MultiQuestion multiQuestion);

@Select("select questionId from multi_question where subject =#{subject} order by rand() desc limit #{pageNo}")

List findBySubject(String subject,Integer pageNo);

}

//填空题

@Mapper

public interface FillQuestionMapper {

@Select("select * from fill_question where questionId in (select questionId from paper_manage where questionType = 2 and paperId = #{paperId})")

List findByIdAndType(Integer paperId);

@Select("select * from fill_question")

IPage findAll(Page page);

/**

* 查询最后一条questionId

* @return FillQuestion

*/

@Select("select questionId from fill_question order by questionId desc limit 1")

FillQuestion findOnlyQuestionId();

@Options(useGeneratedKeys = true,keyProperty ="questionId" )

@Insert("insert into fill_question(subject,question,answer,analysis,level,section) values " +

"(#{subject,},#{question},#{answer},#{analysis},#{level},#{section})")

int add(FillQuestion fillQuestion);

@Select("select questionId from fill_question where subject = #{subject} order by rand() desc limit #{pageNo}")

List findBySubject(String subject,Integer pageNo);

}

//判断题

@Mapper

public interface JudgeQuestionMapper {

@Select("select * from judge_question where questionId in (select questionId from paper_manage where questionType = 3 and paperId = #{paperId})")

List findByIdAndType(Integer paperId);

@Select("select * from judge_question")

IPage findAll(Page page);

/**

* 查询最后一条记录的questionId

* @return JudgeQuestion

*/

@Select("select questionId from judge_question order by questionId desc limit 1")

JudgeQuestion findOnlyQuestionId();

@Insert("insert into judge_question(subject,question,answer,analysis,level,section) values " +

"(#{subject},#{question},#{answer},#{analysis},#{level},#{section})")

int add(JudgeQuestion judgeQuestion);

@Select("select questionId from judge_question where subject=#{subject} order by rand() desc limit #{pageNo}")

List findBySubject(String subject,Integer pageNo);

}

写好mapper底层查询后,需要创建service及其实现类来调用mapper底层。例如:

public interface JudgeQuestionService {

List findByIdAndType(Integer paperId);

IPage findAll(Page page);

JudgeQuestion findOnlyQuestionId();

int add(JudgeQuestion judgeQuestion);

List findBySubject(String subject,Integer pageNo);

}

@Service

public class JudgeQuestionServiceImpl implements JudgeQuestionService {

@Autowired

private JudgeQuestionMapper judgeQuestionMapper;

@Override

public List findByIdAndType(Integer paperId) {

return judgeQuestionMapper.findByIdAndType(paperId);

}

@Override

public IPage findAll(Page page) {

return judgeQuestionMapper.findAll(page);

}

@Override

public JudgeQuestion findOnlyQuestionId() {

return judgeQuestionMapper.findOnlyQuestionId();

}

@Override

public int add(JudgeQuestion judgeQuestion) {

return judgeQuestionMapper.add(judgeQuestion);

}

@Override

public List findBySubject(String subject, Integer pageNo) {

return judgeQuestionMapper.findBySubject(subject,pageNo);

}

}

最后将输出文件方法写在controller层:

@RequestMapping("/exam/exportWord")

public void exportWord(int examCode, HttpServletResponse response) throws FileNotFoundException{

//由于题目应于考试信息对应 所以需要先查出考试信息后根据pageId来查找对应的组卷信息

ExamManage res = examManageService.findById(examCode);

int paperId = res.getPaperId();

List multiQuestionRes = multiQuestionService.findByIdAndType(paperId); //选择题题库 1

List fillQuestionsRes = fillQuestionService.findByIdAndType(paperId); //填空题题库 2

List judgeQuestionRes = judgeQuestionService.findByIdAndType(paperId);

//响应到客户端

XWPFDocument document= new XWPFDocument();

//分页

XWPFParagraph firstParagraph = document.createParagraph();

//格式化段落

firstParagraph.getStyleID();

XWPFRun run = firstParagraph.createRun();

int i = 1;

run.setText("一、选择题" + "\r\n"); //换行

for (MultiQuestion multiQuestion : multiQuestionRes) {

String str = multiQuestion.getQuestion();

String str1 = multiQuestion.getAnswerA();

String str2 = multiQuestion.getAnswerB();

String str3 = multiQuestion.getAnswerC();

String str4 = multiQuestion.getAnswerD();

run.setText(i + ". " + str + "\r\n");

run.setText("A. " + str1 + "\r\n");

run.setText("B. " + str2 + "\r\n");

run.setText("C. " + str3 + "\r\n");

run.setText("D. " + str4 + "\r\n");

i++;

}

run.setText("二、填空题" + "\r\n");

for (FillQuestion fillQuestion : fillQuestionsRes) {

String str = fillQuestion.getQuestion();

run.setText(i + ". " + str + "\r\n");

i++;

}

run.setText("三、判断题" + "\r\n");

for (JudgeQuestion judgeQuestion : judgeQuestionRes) {

String str = judgeQuestion.getQuestion();

run.setText(i + ". " + str + "\r\n");

i++;

}

document.createTOC();

try {

//设置相应头

this.setResponseHeader(response, res.getSource() + "试卷.doc");

//输出流

OutputStream os = response.getOutputStream();

document.write(os);

os.flush();

os.close();

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 发送响应流方法

*/

private void setResponseHeader(HttpServletResponse response, String fileName) {

try {

try {

fileName = URLEncoder.encode(fileName, "UTF-8");

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

response.setContentType("application/octet-stream;charset=UTF-8");

response.setHeader("Content-Disposition", "attachment;filename="+ fileName);

//遵守缓存规定

response.addHeader("Pargam", "no-cache");

response.addHeader("Cache-Control", "no-cache");

} catch (Exception ex) {

ex.printStackTrace();

}

}

效果:


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:VDP文件级恢复需要在用VDP备份的机器上浏览
下一篇:ping交换机的SVI地址出现延迟并且很不稳定
相关文章

 发表评论

暂时没有评论,来抢沙发吧~