在 Springboot 項目,經(jīng)常需要和一些工作文檔文件進行交互,例如導入 excel 數(shù)據(jù)、或者輸出 word 文檔的數(shù)據(jù)。在項目中該如何實現(xiàn)該功能?本篇文章,將為大家介紹在 Springboot 中實現(xiàn)自動輸出 word 文檔的功能。
spring boot實現(xiàn)自動輸出word文檔功能
本文用到Apache POI組件
組件依賴在pom.xml文件中添加
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.0</version>
</dependency>
首先創(chuàng)建相關(guān)的實體類、編寫需要用到的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; //題目解析
}
創(chuàng)建好要用到的實體類之后,利用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<MultiQuestion> findByIdAndType(Integer PaperId);
@Select("select * from multi_question")
IPage<MultiQuestion> 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<Integer> 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<FillQuestion> findByIdAndType(Integer paperId);
@Select("select * from fill_question")
IPage<FillQuestion> 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<Integer> 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<JudgeQuestion> findByIdAndType(Integer paperId);
@Select("select * from judge_question")
IPage<JudgeQuestion> 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<Integer> findBySubject(String subject,Integer pageNo);
}
寫好mapper底層查詢后,需要創(chuàng)建service及其實現(xiàn)類來調(diào)用mapper底層。例如:
public interface JudgeQuestionService {
List<JudgeQuestion> findByIdAndType(Integer paperId);
IPage<JudgeQuestion> findAll(Page<JudgeQuestion> page);
JudgeQuestion findOnlyQuestionId();
int add(JudgeQuestion judgeQuestion);
List<Integer> findBySubject(String subject,Integer pageNo);
}
@Service
public class JudgeQuestionServiceImpl implements JudgeQuestionService {
@Autowired
private JudgeQuestionMapper judgeQuestionMapper;
@Override
public List<JudgeQuestion> findByIdAndType(Integer paperId) {
return judgeQuestionMapper.findByIdAndType(paperId);
}
@Override
public IPage<JudgeQuestion> findAll(Page<JudgeQuestion> 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<Integer> findBySubject(String subject, Integer pageNo) {
return judgeQuestionMapper.findBySubject(subject,pageNo);
}
}
最后將輸出文件方法寫在controller層:
@RequestMapping("/exam/exportWord")
public void exportWord(int examCode, HttpServletResponse response) throws FileNotFoundException{
//由于題目應(yīng)于考試信息對應(yīng) 所以需要先查出考試信息后根據(jù)pageId來查找對應(yīng)的組卷信息
ExamManage res = examManageService.findById(examCode);
int paperId = res.getPaperId();
List<MultiQuestion> multiQuestionRes = multiQuestionService.findByIdAndType(paperId); //選擇題題庫 1
List<FillQuestion> fillQuestionsRes = fillQuestionService.findByIdAndType(paperId); //填空題題庫 2
List<JudgeQuestion> judgeQuestionRes = judgeQuestionService.findByIdAndType(paperId);
//響應(yīng)到客戶端
XWPFDocument document= new XWPFDocument();
//分頁
XWPFParagraph firstParagraph = document.createParagraph();
//格式化段落
firstParagraph.getStyleID();
XWPFRun run = firstParagraph.createRun();
int i = 1;
run.setText("一、選擇題" + "
"); //換行
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 + "
");
run.setText("A. " + str1 + "
");
run.setText("B. " + str2 + "
");
run.setText("C. " + str3 + "
");
run.setText("D. " + str4 + "
");
i++;
}
run.setText("二、填空題" + "
");
for (FillQuestion fillQuestion : fillQuestionsRes) {
String str = fillQuestion.getQuestion();
run.setText(i + ". " + str + "
");
i++;
}
run.setText("三、判斷題" + "
");
for (JudgeQuestion judgeQuestion : judgeQuestionRes) {
String str = judgeQuestion.getQuestion();
run.setText(i + ". " + str + "
");
i++;
}
document.createTOC();
try {
//設(shè)置相應(yīng)頭
this.setResponseHeader(response, res.getSource() + "試卷.doc");
//輸出流
OutputStream os = response.getOutputStream();
document.write(os);
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 發(fā)送響應(yīng)流方法
*/
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);
//遵守緩存規(guī)定
response.addHeader("Pargam", "no-cache");
response.addHeader("Cache-Control", "no-cache");
} catch (Exception ex) {
ex.printStackTrace();
}
}
效果:
到此這篇關(guān)于Java代碼實現(xiàn)spring boot實現(xiàn)自動輸出word文檔功能的文章就介紹到這了,想要了解更多相關(guān)spring boot和工作文檔操作的內(nèi)容,請搜索W3Cschool以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持!