如何使用 Spring Data JPA 上传 excel 或从 excel 文件导入数据
How to upload excel or import data from excel file using Spring Data JPA
我正在尝试使用 Spring Data Jpa 中的 DTO 从 excel sheet 导入数据。但是,每当我从 postman 生成 post 时,我都会收到一条错误消息,指出不支持媒体类型。
请看截图中我的postman设置:
请在下面找到控制器代码:
@RestController
@RequestMapping("api/auditors_report")
public class AuditorStampDutyReportController {
@Autowired
public AuditorStampDutyReportRepository auditorStampDutyReportRepository;
@Autowired
public AuditorStampDutyReportService auditorStampDutyReportService;
@Transactional
@PostMapping(path = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE,produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Object> uploadAuditorReport(@RequestPart("file")MultipartFile file){
List <AuditorStampDutyReport> uploadExcelSheet = auditorStampDutyReportService.importAuditorStampDutyReportDetails(file);
return ResponseEntity.ok(new JsonResponse("See Data object for Details!", uploadExcelSheet));
}
}
这是我的 excel 助手
@Component
@Data
public class ImportExcelHelper {
public static String getOrDefault(Cell cell, String defaultValue) {
return isCellEmpty(cell) ? defaultValue : getString(cell);
}
public static Double getDouble(Cell cell) {
return cell.getCellType() == CellType.STRING ? Double.valueOf(cell.getStringCellValue()) : cell.getNumericCellValue();
}
public static Integer getInteger(Cell cell){
return cell.getCellType() == CellType.STRING ?
Integer.valueOf(cell.getStringCellValue()) : Integer.valueOf(cell.getNumericCellValue()+"");
}
public static Long getLong(Cell cell){
return cell.getCellType() == CellType.STRING ?
Long.valueOf(cell.getStringCellValue()): Long.valueOf(cell.getNumericCellValue()+ "");
}
public static String getString(Cell cell) {
return cell.getCellType() == CellType.NUMERIC ? String.valueOf(cell.getNumericCellValue()) : cell.getStringCellValue().trim();
}
public static boolean isCellEmpty(Cell cell) {
if (cell == null || cell.getCellType() == CellType.BLANK) {
return true;
}
return cell.getCellType() == CellType.STRING && cell.getStringCellValue().trim().isEmpty();
}
public static LocalDate getDate(Cell cell) {
if (isCellEmpty(cell)) {
return null;
}
try {
Date date = cell.getDateCellValue();
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
} catch (Exception e) {
return getDate(cell.getStringCellValue());
}
}
public static LocalDate getDate(String date) {
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendOptional(DateTimeFormatter.ofPattern("d/MM/yyyy"))
.appendOptional(DateTimeFormatter.ofPattern("d/M/yyyy"))
.appendOptional(DateTimeFormatter.ofPattern("dd/M/yyyy"))
.appendOptional(DateTimeFormatter.ofPattern("dd/MM/yyyy"))
.toFormatter();
return LocalDate.parse(date, formatter);
}
}
这是我的服务:
@Transactional
public List <AuditorStampDutyReport> importAuditorStampDutyReportDetails(MultipartFile mfile) {
List<AuditorStampDutyReport> uploadReport = new ArrayList<>();
AuditorStampDutyReport excelReport = new AuditorStampDutyReport();
int sheetNumber = 0, rowNumber = 0;
try {
Workbook workbook = new XSSFWorkbook(mfile.getInputStream());
for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
sheetNumber = i;
Sheet sheet = workbook.getSheetAt(i);
for (Row row : sheet) {
rowNumber = row.getRowNum();
if (rowNumber < 2) {
String possibleTaxPayerId = ImportExcelHelper.getOrDefault(row.getCell(1), "").trim().replaceAll(" +", " ");
Organization organization = null;
//for name of tax payer
if (possibleTaxPayerId != null) {
organization = organizationRepository.findFirstNameByNameLike(organization.getId(), possibleTaxPayerId);
}
excelReport.setOrganization(organization);
excelReport.setTin_of_tax_payer_organization(ImportExcelHelper.getString(row.getCell(2)));
excelReport.setPeriod_covered(ImportExcelHelper.getOrDefault(row.getCell(3), ""));
continue;
}
if (rowNumber > 2 && rowNumber < 6){
excelReport.setDate_of_transaction(ImportExcelHelper.getDate(row.getCell(2)));
excelReport.setDuty_payer(ImportExcelHelper.getString(row.getCell(3)));
excelReport.setTin_of_duty_payer(ImportExcelHelper.getString(row.getCell(4)));
String possibleInstrumentId = ImportExcelHelper.getOrDefault(row.getCell(5), "");
Instruments instruments = null;
if (possibleInstrumentId != null) {
instruments = instrumentsRepository.findByNameLike(instruments.getId(), possibleInstrumentId);
}
excelReport.setInstruments(instruments);
excelReport.setAssessment_number(ImportExcelHelper.getLong(row.getCell(6)));
DeedOfAssignment deedOfAssignment = null;
if(deedOfAssignment.getId()!=null && deedOfAssignment.getId()>0) {
}}
这是我的 dto
import lombok.Data;
import java.time.LocalDate;
@Data
public class AuditorStampDutyReportDto {
private Long id;
private Long id_of_tax_payer_organization;
private String duty_payer;
private String tin_of_tax_payer_organization;
private String period_covered;
private LocalDate date_of_transaction;
private String tin_of_duty_payer;
private String address_of_duty_payer;
private Long instrument_id;
private Long assessment_number;
private String receipt_number;
private Double consideration;
private Double rate;
private Double amount_payable;
private Double amount_paid;
private Double balance;
private Double penalty;
private LocalDate date_of_payment;
private Double amount_recoverable;
private Double outstanding;
private String remarks;
private Long user_profile_id;
private Long deed_of_assignment_id;
private Long state_id;
private Long lga_id;
private Long ward;
private String description_of_location;
}
我的主要实体class
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import javax.persistence.*;
import java.io.Serializable;
import java.time.LocalDate;
@Data
@Entity
@Table(name="auditor_stamp_duty_report")
public class AuditorStampDutyReport implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@JsonIgnore
@ManyToOne
@JoinColumn(name = "id_of_tax_payer_organization", referencedColumnName = "id")
private Organization organization;
@Column(name = "tin_of_tax_payer_organization")
private String tin_of_tax_payer_organization;
@Column(name = "period_covered")
private String period_covered;
@Column(name = "date_of_transaction")
private LocalDate date_of_transaction;
@JoinColumn(name = "duty_payer")
private String duty_payer;
@Column(name = "tin_of_duty_payer")
private String tin_of_duty_payer;
@Column(name = "address_of_duty_payer")
private String address_of_duty_payer;
@JsonIgnore
@ManyToOne
@JoinColumn(name = "instrument_id", referencedColumnName = "id")
private Instruments instruments;
@Column(name = "assessment_number")
private Long assessment_number;
@Column(name = "receipt_number")
private String receipt_number;
@Column(name = "consideration")
private Double consideration;
@Column(name = "rate")
private Double rate;
@Column(name = "amount_payable")
private Double amount_payable;
@Column(name = "amount_paid")
private Double amount_paid;
@Column(name = "balance")
private Double balance;
@Column(name = "penalty")
private Double penalty;
@Column(name = "outstanding")
private Double outstanding;
@Column(name = "remarks")
private String remarks;
@Column(name="amount_recoverable")
private Double amount_recoverable;
@Column(name="date_of_payment")
private LocalDate date_of_payment;
@JsonIgnore
@ManyToOne
@JoinColumn(name = "user_profile_id", referencedColumnName = "id")
private UserProfile userProfile;
@OneToOne(cascade = CascadeType.ALL)
@JoinTable(
name="auditor_stamp_duty_report_deed_of_assignment",
joinColumns = @JoinColumn(name="auditor_stamp_duty_report_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name="deed_of_assignment_id", referencedColumnName = "id")
)
private DeedOfAssignment deed_of_assignment_id;
}
来自 postman
的错误
"status": 415,
"error": "Unsupported Media Type",
"trace": "org.springframework.web.HttpMediaTypeNotSupportedException: Content type '' not supported\r\n\tat org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:227)\r\n\tat org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:422)\r\n\tat org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:367)\r\n\tat org.springframework.web.servlet.mvc.method.
非常感谢你的帮助。提前致谢
我发现了问题,我没有把任何参数放在邮递员下的关键列。这是一个截图。对于未来的读者如何设置邮递员参数以导入文件以进行测试。
我正在尝试使用 Spring Data Jpa 中的 DTO 从 excel sheet 导入数据。但是,每当我从 postman 生成 post 时,我都会收到一条错误消息,指出不支持媒体类型。
请看截图中我的postman设置:
请在下面找到控制器代码:
@RestController
@RequestMapping("api/auditors_report")
public class AuditorStampDutyReportController {
@Autowired
public AuditorStampDutyReportRepository auditorStampDutyReportRepository;
@Autowired
public AuditorStampDutyReportService auditorStampDutyReportService;
@Transactional
@PostMapping(path = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE,produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Object> uploadAuditorReport(@RequestPart("file")MultipartFile file){
List <AuditorStampDutyReport> uploadExcelSheet = auditorStampDutyReportService.importAuditorStampDutyReportDetails(file);
return ResponseEntity.ok(new JsonResponse("See Data object for Details!", uploadExcelSheet));
}
}
这是我的 excel 助手
@Component
@Data
public class ImportExcelHelper {
public static String getOrDefault(Cell cell, String defaultValue) {
return isCellEmpty(cell) ? defaultValue : getString(cell);
}
public static Double getDouble(Cell cell) {
return cell.getCellType() == CellType.STRING ? Double.valueOf(cell.getStringCellValue()) : cell.getNumericCellValue();
}
public static Integer getInteger(Cell cell){
return cell.getCellType() == CellType.STRING ?
Integer.valueOf(cell.getStringCellValue()) : Integer.valueOf(cell.getNumericCellValue()+"");
}
public static Long getLong(Cell cell){
return cell.getCellType() == CellType.STRING ?
Long.valueOf(cell.getStringCellValue()): Long.valueOf(cell.getNumericCellValue()+ "");
}
public static String getString(Cell cell) {
return cell.getCellType() == CellType.NUMERIC ? String.valueOf(cell.getNumericCellValue()) : cell.getStringCellValue().trim();
}
public static boolean isCellEmpty(Cell cell) {
if (cell == null || cell.getCellType() == CellType.BLANK) {
return true;
}
return cell.getCellType() == CellType.STRING && cell.getStringCellValue().trim().isEmpty();
}
public static LocalDate getDate(Cell cell) {
if (isCellEmpty(cell)) {
return null;
}
try {
Date date = cell.getDateCellValue();
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
} catch (Exception e) {
return getDate(cell.getStringCellValue());
}
}
public static LocalDate getDate(String date) {
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendOptional(DateTimeFormatter.ofPattern("d/MM/yyyy"))
.appendOptional(DateTimeFormatter.ofPattern("d/M/yyyy"))
.appendOptional(DateTimeFormatter.ofPattern("dd/M/yyyy"))
.appendOptional(DateTimeFormatter.ofPattern("dd/MM/yyyy"))
.toFormatter();
return LocalDate.parse(date, formatter);
}
}
这是我的服务:
@Transactional
public List <AuditorStampDutyReport> importAuditorStampDutyReportDetails(MultipartFile mfile) {
List<AuditorStampDutyReport> uploadReport = new ArrayList<>();
AuditorStampDutyReport excelReport = new AuditorStampDutyReport();
int sheetNumber = 0, rowNumber = 0;
try {
Workbook workbook = new XSSFWorkbook(mfile.getInputStream());
for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
sheetNumber = i;
Sheet sheet = workbook.getSheetAt(i);
for (Row row : sheet) {
rowNumber = row.getRowNum();
if (rowNumber < 2) {
String possibleTaxPayerId = ImportExcelHelper.getOrDefault(row.getCell(1), "").trim().replaceAll(" +", " ");
Organization organization = null;
//for name of tax payer
if (possibleTaxPayerId != null) {
organization = organizationRepository.findFirstNameByNameLike(organization.getId(), possibleTaxPayerId);
}
excelReport.setOrganization(organization);
excelReport.setTin_of_tax_payer_organization(ImportExcelHelper.getString(row.getCell(2)));
excelReport.setPeriod_covered(ImportExcelHelper.getOrDefault(row.getCell(3), ""));
continue;
}
if (rowNumber > 2 && rowNumber < 6){
excelReport.setDate_of_transaction(ImportExcelHelper.getDate(row.getCell(2)));
excelReport.setDuty_payer(ImportExcelHelper.getString(row.getCell(3)));
excelReport.setTin_of_duty_payer(ImportExcelHelper.getString(row.getCell(4)));
String possibleInstrumentId = ImportExcelHelper.getOrDefault(row.getCell(5), "");
Instruments instruments = null;
if (possibleInstrumentId != null) {
instruments = instrumentsRepository.findByNameLike(instruments.getId(), possibleInstrumentId);
}
excelReport.setInstruments(instruments);
excelReport.setAssessment_number(ImportExcelHelper.getLong(row.getCell(6)));
DeedOfAssignment deedOfAssignment = null;
if(deedOfAssignment.getId()!=null && deedOfAssignment.getId()>0) {
}}
这是我的 dto
import lombok.Data;
import java.time.LocalDate;
@Data
public class AuditorStampDutyReportDto {
private Long id;
private Long id_of_tax_payer_organization;
private String duty_payer;
private String tin_of_tax_payer_organization;
private String period_covered;
private LocalDate date_of_transaction;
private String tin_of_duty_payer;
private String address_of_duty_payer;
private Long instrument_id;
private Long assessment_number;
private String receipt_number;
private Double consideration;
private Double rate;
private Double amount_payable;
private Double amount_paid;
private Double balance;
private Double penalty;
private LocalDate date_of_payment;
private Double amount_recoverable;
private Double outstanding;
private String remarks;
private Long user_profile_id;
private Long deed_of_assignment_id;
private Long state_id;
private Long lga_id;
private Long ward;
private String description_of_location;
}
我的主要实体class
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import javax.persistence.*;
import java.io.Serializable;
import java.time.LocalDate;
@Data
@Entity
@Table(name="auditor_stamp_duty_report")
public class AuditorStampDutyReport implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@JsonIgnore
@ManyToOne
@JoinColumn(name = "id_of_tax_payer_organization", referencedColumnName = "id")
private Organization organization;
@Column(name = "tin_of_tax_payer_organization")
private String tin_of_tax_payer_organization;
@Column(name = "period_covered")
private String period_covered;
@Column(name = "date_of_transaction")
private LocalDate date_of_transaction;
@JoinColumn(name = "duty_payer")
private String duty_payer;
@Column(name = "tin_of_duty_payer")
private String tin_of_duty_payer;
@Column(name = "address_of_duty_payer")
private String address_of_duty_payer;
@JsonIgnore
@ManyToOne
@JoinColumn(name = "instrument_id", referencedColumnName = "id")
private Instruments instruments;
@Column(name = "assessment_number")
private Long assessment_number;
@Column(name = "receipt_number")
private String receipt_number;
@Column(name = "consideration")
private Double consideration;
@Column(name = "rate")
private Double rate;
@Column(name = "amount_payable")
private Double amount_payable;
@Column(name = "amount_paid")
private Double amount_paid;
@Column(name = "balance")
private Double balance;
@Column(name = "penalty")
private Double penalty;
@Column(name = "outstanding")
private Double outstanding;
@Column(name = "remarks")
private String remarks;
@Column(name="amount_recoverable")
private Double amount_recoverable;
@Column(name="date_of_payment")
private LocalDate date_of_payment;
@JsonIgnore
@ManyToOne
@JoinColumn(name = "user_profile_id", referencedColumnName = "id")
private UserProfile userProfile;
@OneToOne(cascade = CascadeType.ALL)
@JoinTable(
name="auditor_stamp_duty_report_deed_of_assignment",
joinColumns = @JoinColumn(name="auditor_stamp_duty_report_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name="deed_of_assignment_id", referencedColumnName = "id")
)
private DeedOfAssignment deed_of_assignment_id;
}
来自 postman
的错误"status": 415,
"error": "Unsupported Media Type",
"trace": "org.springframework.web.HttpMediaTypeNotSupportedException: Content type '' not supported\r\n\tat org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:227)\r\n\tat org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:422)\r\n\tat org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:367)\r\n\tat org.springframework.web.servlet.mvc.method.
非常感谢你的帮助。提前致谢
我发现了问题,我没有把任何参数放在邮递员下的关键列。这是一个截图。对于未来的读者如何设置邮递员参数以导入文件以进行测试。