SpringBootでApachePOIを使ったxlsxに印刷設定

# この記事はこれの続きです

https://qiita.com/waokitsune/items/be5f171ed781dfc3980e

# 概要

xlsxの生成とダウンロードは以前の記事でやってるので説明は省略。
印刷設定がメインです。

『全ての列を1ページに印刷』は試行錯誤して、想定通りになるまでけっこう時間かかったので、そのノウハウも書いてます。

# Controllerクラス

```java:DemoController.java
package com.example.demo;


import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.PageMargin;
import org.apache.poi.ss.usermodel.PrintSetup;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;


@Controller
public class DemoController {
	
	
	@GetMapping("/")
	public void getIndex(HttpServletResponse response) throws IOException {
		
		
		//---------------------------------------------------------------------------------------------
		//エクセルファイル生成。
		Workbook workbook_ = new XSSFWorkbook();
		Sheet sheet_ = workbook_.createSheet("ふーたお");
		
		Row row_;
		Cell cell_;
		
		row_ = sheet_.createRow(1);
		cell_ = row_.createCell(CellReference.convertColStringToIndex("B"));
		cell_.setCellValue("私とお茶しない？");
		cell_ = row_.createCell(CellReference.convertColStringToIndex("H"));
		cell_.setCellValue("私とお茶しない？");
		
		row_ = sheet_.createRow(40);
		cell_ = row_.createCell(CellReference.convertColStringToIndex("A"));
		cell_.setCellValue("私とお茶しない？");
		
		
		//---------------------------------------------------------------------------------------------
		//今回のメインはここ！
		
		PrintSetup print_setup_ = sheet_.getPrintSetup();
		
		//用紙サイズを指定しないと拡大縮小系設定をした際にレターサイズになってしまうので注意。
		print_setup_.setPaperSize(PrintSetup.A4_PAPERSIZE);
		
		//用紙横向き。
		print_setup_.setLandscape(true);
		
		//印刷タイトル行。
		sheet_.setRepeatingRows(
				new CellRangeAddress(
						0,//1行目から…
						3,//4行目までがタイトル行。
						-1,//列の左端指定は無し。
						-1//列の右端指定は無し。
				)
		);
		
		//印刷余白設定。
		sheet_.setMargin(PageMargin.HEADER, 0);
		sheet_.setMargin(PageMargin.FOOTER, 0);
		sheet_.setMargin(PageMargin.TOP, 0);
		sheet_.setMargin(PageMargin.RIGHT, 0);
		sheet_.setMargin(PageMargin.BOTTOM, 0);
		sheet_.setMargin(PageMargin.LEFT, 0);
		
		//全ての列を1ページに印刷。
		
		//setFitWidth()やsetFitHeight()より前に、
		//setFitToPage(true)をすることが『全ての列を1ページに印刷』には必須。
		sheet_.setFitToPage(true);
		
		//全列を1ページに収める。
		print_setup_.setFitWidth((short) 1);
		
		//setFitHeight()で明示的に0を設定することも『全ての列を1ページに印刷』には必須。
		print_setup_.setFitHeight((short) 0);
		
		
		//---------------------------------------------------------------------------------------------
		//ダウンロード。
		response.addHeader(
				"Content-Disposition", 
				"attachment; filename*=UTF-8''" + URLEncoder.encode("胡桃.xlsx", StandardCharsets.UTF_8.name()));
		
		ServletOutputStream stream_ = response.getOutputStream();
		workbook_.write(stream_);
		stream_.close();
		
		workbook_.close();
		
		
	}
	
	
}
```

# 実行結果

ブラウザーでhttp:\//localhost:8080にアクセスしてダウンロードできたxlsxを印刷プレビューすると…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/5f85a1e4-2fc8-fa78-3adc-b4aaa08ed0b0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/7b5d9ea2-6fad-a85c-09db-d8c53621422a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/70dc94fd-158a-0269-112b-a1f150c703bd.png)

# この記事の続き

https://qiita.com/waokitsune/items/0b8ebb2c851a0562b924

# バージョン

Microsoft Windows [Version 10.0.22631.3447]
JAVA 17.0.8.1
Spring Boot v3.1.10
ApachePOI 5.2.5