jxl導出Excel文件

来源:http://www.cnblogs.com/ablejava/archive/2016/08/19/5788655.html
-Advertisement-
Play Games

一、java項目實現讀取Excel文件和導出Excel文件 實現讀取和導出Excel文件的代碼: 導出結果: 二、web項目中實現導出Excel文件 2.1、新建動態web項目 新建項目後在項目中添加jxl-2.6.jar文件和servlet-api.jar文件。 2.2、新建數據實體對象Membe ...


一、java項目實現讀取Excel文件和導出Excel文件

實現讀取和導出Excel文件的代碼:

package servlet;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.CellFormat;
import jxl.format.Colour;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
public class Excel {

	/**
	 * @param args
	 * Excel讀寫程式
	 * @throws IOException 
	 * @throws BiffException 
	 */
	public static void main(String[] args) throws BiffException, IOException {
		//導出Excel文件
		writeExcel();
		//讀取Excel文件
		//readExcel();
	}
	
	//讀Excel文件
	public static void readExcel() throws BiffException, IOException{
		 //創建一個list 用來存儲讀取的內容
		  List list = new ArrayList();
		  Workbook rwb = null;
		  Cell cell = null;
		  
		  //創建輸入流
		  InputStream stream = new FileInputStream("d:\\testJXL.xls");
		  
		  //獲取Excel文件對象
		  rwb = Workbook.getWorkbook(stream);
		  
		  //獲取文件的指定工作表 預設的第一個
		  Sheet sheet = rwb.getSheet(0);  
		 
		  //行數(表頭的目錄不需要,從1開始)
		  for(int i=0; i<sheet.getRows(); i++){
		   
		   //創建一個數組 用來存儲每一列的值
		   String[] str = new String[sheet.getColumns()];
		   
		   //列數
		   for(int j=0; j<sheet.getColumns(); j++){
		   
		    //獲取第i行,第j列的值
		    cell = sheet.getCell(j,i);    
		    str[j] = cell.getContents();
		    
		   }
		   //把剛獲取的列存入list
		   list.add(str);
		  }
		  for(int i=0;i<list.size();i++){
			  String[] str = (String[])list.get(i);
			  for(int j=0;j<str.length;j++){
				  System.out.println(str[j]);
			  }
		  }
		}

	/**
	 * 寫Excel文件
	 */
	public static void writeExcel() {
		String[] title = { "編號", "產品名稱", "產品價格", "產品數量", "生產日期", "產地", "是否出口" };
		try {
			// 獲得開始時間
			long start = System.currentTimeMillis();
			// 輸出的excel的路徑
			String filePath = "e:\\testJXL.xls";
			// 創建Excel工作薄
			WritableWorkbook wwb;
			// 新建立一個jxl文件,即在d盤下生成testJXL.xls
			OutputStream os = new FileOutputStream(filePath);
			wwb = Workbook.createWorkbook(os);
			// 添加第一個工作表並設置第一個Sheet的名字
			WritableSheet sheet = wwb.createSheet("產品清單", 0);
			Label label;
			for (int i = 0; i < title.length; i++) {
				// Label(x,y,z) 代表單元格的第x+1列,第y+1行, 內容z
				// 在Label對象的子對象中指明單元格的位置和內容
				//label = new Label(i, 0, title[i]);
				label = new Label(i, 0, title[i], getHeader());
				// 將定義好的單元格添加到工作表中
				sheet.addCell(label);
			}
			// 下麵是填充數據
			/*
			 * 保存數字到單元格,需要使用jxl.write.Number 必須使用其完整路徑,否則會出現錯誤
			 */
			// 填充產品編號
			jxl.write.Number number = new jxl.write.Number(0, 1, 20071001);
			sheet.addCell(number);
			// 填充產品名稱
			label = new Label(1, 1, "金鴿瓜子");
			sheet.addCell(label);
			/*
			 * 定義對於顯示金額的公共格式 jxl會自動實現四捨五入 例如 2.456會被格式化為2.46,2.454會被格式化為2.45
			 */
			jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#,###.00");
			jxl.write.WritableCellFormat wcf = new jxl.write.WritableCellFormat(nf);
			// 填充產品價格
			jxl.write.Number nb = new jxl.write.Number(2, 1, 200000.45, wcf);
			sheet.addCell(nb);
			// 填充產品數量
			jxl.write.Number numb = new jxl.write.Number(3, 1, 200);
			sheet.addCell(numb);
			/*
			 * 定義顯示日期的公共格式 如:yyyy-MM-dd hh:mm
			 */
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			String newdate = sdf.format(new Date());
			// 填充出產日期
			label = new Label(4, 1, newdate);
			sheet.addCell(label);
			// 填充產地
			label = new Label(5, 1, "陝西西安");
			sheet.addCell(label);
			/*
			 * 顯示布爾值
			 */
			jxl.write.Boolean bool = new jxl.write.Boolean(6, 1, true);
			sheet.addCell(bool);
			/*
			 * 合併單元格 通過writablesheet.mergeCells(int x,int y,int m,int n);來實現的
			 * 表示將從第x+1列,y+1行到m+1列,n+1行合併
			 */
			sheet.mergeCells(0, 3, 2, 3);
			label = new Label(0, 3, "合併了三個單元格");
			sheet.addCell(label);
			/*
			 * 
			 * 定義公共字體格式 通過獲取一個字體的樣式來作為模板 首先通過web.getSheet(0)獲得第一個sheet
			 * 然後取得第一個sheet的第二列,第一行也就是"產品名稱"的字體
			 */
			CellFormat cf = wwb.getSheet(0).getCell(1, 0).getCellFormat();
			WritableCellFormat wc = new WritableCellFormat();
			// 設置居中
			wc.setAlignment(Alignment.CENTRE);
			// 設置邊框線
			wc.setBorder(Border.ALL, BorderLineStyle.THIN);
			// 設置單元格的背景顏色
			wc.setBackground(jxl.format.Colour.RED);
			label = new Label(1, 5, "字體", wc);
			sheet.addCell(label);

			// 設置字體
			jxl.write.WritableFont wfont = new jxl.write.WritableFont(WritableFont.createFont("隸書"), 20);
			WritableCellFormat font = new WritableCellFormat(wfont);
			label = new Label(2, 6, "隸書", font);
			sheet.addCell(label);

			// 寫入數據
			wwb.write();
			// 關閉文件
			wwb.close();
			long end = System.currentTimeMillis();
			System.out.println("----完成該操作共用的時間是:" + (end - start) / 1000);
		} catch (Exception e) {
			System.out.println("---出現異常---");
			e.printStackTrace();
		}
	}

	/**
	 * 設置頭的樣式
	 * @return
	 */
	public static WritableCellFormat getHeader() {
		WritableCellFormat format = null;
		try {
			WritableFont font = new WritableFont(WritableFont.TIMES, 10, WritableFont.BOLD);// 定義字體
			font.setColour(Colour.BLUE);// 藍色字體
			format = new WritableCellFormat(font);
			format.setAlignment(jxl.format.Alignment.CENTRE);// 左右居中
			format.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);// 上下居中
			format.setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK);// 黑色邊框
			format.setBackground(Colour.YELLOW);// 黃色背景
		} catch (WriteException e) {
			e.printStackTrace();
		}
		return format;
	}
}

導出結果:

二、web項目中實現導出Excel文件

2.1、新建動態web項目

新建項目後在項目中添加jxl-2.6.jar文件和servlet-api.jar文件。

2.2、新建數據實體對象Member.java

package entity;

import java.util.Date;
public class Member implements java.io.Serializable {

	// Fields

	private String id;

	private String checkOrg;

	private String sn;

	private String memberName;

	private String sex;

	private String cardId;

	private String duty;

	private String title;

	private String academic;

	private String special;

	private String workTime;

	private String memo;

	private String role;
	
	private Date lastModify;
	
    private Date regTime;

	// Constructors

	/** default constructor */
	public Member() {
	}

	/** full constructor */
	public Member(String checkOrg, String sn, String memberName, String sex,
			String cardId, String duty, String title, String academic,
			String special, String workTime, String memo, String role, Date lastModify, Date regTime) {
		this.checkOrg = checkOrg;
		this.sn = sn;
		this.memberName = memberName;
		this.sex = sex;
		this.cardId = cardId;
		this.duty = duty;
		this.title = title;
		this.academic = academic;
		this.special = special;
		this.workTime = workTime;
		this.memo = memo;
		this.role = role;
		this.lastModify = lastModify;
		this.regTime = regTime;
	}

	// Property accessors

	public String getId() {
		return this.id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getCheckOrg() {
		return this.checkOrg;
	}

	public void setCheckOrg(String checkOrg) {
		this.checkOrg = checkOrg;
	}

	public String getSn() {
		return this.sn;
	}

	public void setSn(String sn) {
		this.sn = sn;
	}

	public String getMemberName() {
		return this.memberName;
	}

	public void setMemberName(String memberName) {
		this.memberName = memberName;
	}

	public String getSex() {
		return this.sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public String getCardId() {
		return this.cardId;
	}

	public void setCardId(String cardId) {
		this.cardId = cardId;
	}

	public String getDuty() {
		return this.duty;
	}

	public void setDuty(String duty) {
		this.duty = duty;
	}

	public String getTitle() {
		return this.title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getAcademic() {
		return this.academic;
	}

	public void setAcademic(String academic) {
		this.academic = academic;
	}

	public String getSpecial() {
		return this.special;
	}

	public void setSpecial(String special) {
		this.special = special;
	}

	public String getWorkTime() {
		return this.workTime;
	}

	public void setWorkTime(String workTime) {
		this.workTime = workTime;
	}

	public String getMemo() {
		return this.memo;
	}

	public void setMemo(String memo) {
		this.memo = memo;
	}

	public String getRole() {
		return this.role;
	}

	public void setRole(String role) {
		this.role = role;
	}

	public Date getLastModify() {
		return lastModify;
	}

	public void setLastModify(Date lastModify) {
		this.lastModify = lastModify;
	}

	public Date getRegTime() {
		return regTime;
	}

	public void setRegTime(Date regTime) {
		this.regTime = regTime;
	}

}

2.3、添加servlet文件:ExportExlServlet.java

package servlet;

import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import jxl.Workbook;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.Colour;
import jxl.format.VerticalAlignment;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;
import entity.Member;

public class ExportExlServlet extends HttpServlet {

	private WritableWorkbook wwb = null;

	private WritableSheet sheet = null;

	private WritableSheet sheetk = null;

	private WritableSheet sheeth = null;

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String checkOrgId = null;
		String orgName = "XX單位";
		try {
			exportCheckOrgMember(checkOrgId, orgName, response);
		} catch (RowsExceededException e) {
			e.printStackTrace();
		} catch (WriteException e) {
			e.printStackTrace();
		}
		exportExcel(response, wwb, orgName + "人員明細表");
	}
	
	/**
	 * 導出數據處理
	 * @param checkOrgId
	 * @param orgName
	 * @param response
	 * @throws IOException
	 * @throws RowsExceededException
	 * @throws WriteException
	 */
	
	private void exportCheckOrgMember(String checkOrgId,String orgName, HttpServletResponse response)
			throws IOException, RowsExceededException, WriteException {
		//此處listMember需要從資料庫中取值
		List<Member> listMember = new ArrayList<Member>();
		Member member1 = new Member("str", "str", "str", "str", "str", "str", "str", "str", "str", "str", "隸書", "str", new Date(), new Date());
		listMember.add(member1);
		listMember.add(member1);
		listMember.add(member1);
		System.out.println(listMember.size()+"***");
		
		
		response.setContentType("application/ms-excel");
		String sheetName_ = orgName + "人員明細表";//文件名==》XX人員明細表
		String sheetName = new String(sheetName_.getBytes(),"iso8859-1");
		  
		response.addHeader("Content-Disposition", "attachment;filename="+ sheetName + ".xls");

		OutputStream os = response.getOutputStream();
		wwb = Workbook.createWorkbook(os);
		wwb.setProtected(false);

		//EXECL中的一個sheet
		sheetk = wwb.createSheet("人員明細", 0);

		//============設置execl表的一些屬性===========
		WritableFont wf = new WritableFont(WritableFont.ARIAL, 13,WritableFont.BOLD, false);
		WritableCellFormat wcf = new WritableCellFormat(wf);
		WritableFont wf1 = new WritableFont(WritableFont.ARIAL, 13,WritableFont.NO_BOLD, false);
		WritableCellFormat wcf1 = new WritableCellFormat(wf1);
		wcf.setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK);
		wcf.setVerticalAlignment(VerticalAlignment.CENTRE);
		wcf1.setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK);
		wcf1.setVerticalAlignment(VerticalAlignment.CENTRE);
		//============設置execl表的一些屬性======END=====
		
		/*sheetk.mergeCells(0, 0, 9, 0);
		sheetk.addCell(new Label(0, 0, "人員明細表《這是合併的單元格》", wcf));
		
		//添加單元格  new Label(列位置,行位置,單元格內容,WritableCellFormat對象)
		//此處第二個參數1,代表第二行,上面合併的單元格是第一行
		sheetk.addCell(new Label(0, 1, "序號", wcf));
		sheetk.addCell(new Label(1, 1, "姓名", wcf));
		sheetk.addCell(new Label(2, 1, "性別", wcf));
		sheetk.addCell(new Label(3, 1, "身份證號", wcf));
		sheetk.addCell(new Label(4, 1, "學歷", wcf));
		sheetk.addCell(new Label(5, 1, "專業", wcf));
		sheetk.addCell(new Label(6, 1, "職稱", wcf));
		sheetk.addCell(new Label(7, 1, "職務", wcf));
		sheetk.addCell(new Label(8, 1, "角色", wcf));
		sheetk.addCell(new Label(9, 1, "備註", wcf));*/
		
		String[] title = {"編號", "姓名", "性別", "身份證號", "學歷", "專業", "職稱", "職務", "角色", "備註"};
		Label label;
		for (int i = 0; i < title.length; i++) {
			// Label(x,y,z) 代表單元格的第x+1列,第y+1行, 內容z
			// 在Label對象的子對象中指明單元格的位置和內容
			//label = new Label(i, 0, title[i]);
			label = new Label(i, 0, title[i], Excel.getHeader());
			// 將定義好的單元格添加到工作表中
			sheetk.addCell(label);
		}
		// 設置字體
					
		jxl.write.WritableFont wfont = new jxl.write.WritableFont(WritableFont.createFont("隸書"), 20);
		WritableCellFormat font = new WritableCellFormat(wfont);
		//迴圈數據,將數據填充到單元格內
		int t = 1;
		for (Member member:listMember) {
			sheetk.addCell(new Label(0, t, t+"", wcf1));
			sheetk.addCell(new Label(1, t, member.getMemberName(), wcf1));
			sheetk.addCell(new Label(2, t, member.getSex(), wcf1));
			sheetk.addCell(new Label(3, t, member.getCardId(), wcf1));
			sheetk.addCell(new Label(4, t, member.getAcademic(), wcf1));
			sheetk.addCell(new Label(5, t, member.getSpecial(), wcf1));
			sheetk.addCell(new Label(6, t, member.getTitle(), wcf1));
			sheetk.addCell(new Label(7, t, member.getDuty(), wcf1));
			sheetk.addCell(new Label(8, t, member.getRole(), wcf1));
			sheetk.addCell(new Label(9, t, member.getMemo(), font));
			t++;
		}
	}
	
	/*
	 * 執行導出操作
	 */
	private void exportExcel(HttpServletResponse response,
			WritableWorkbook retValue, String filename) {
		response.setContentType("application/ms-excel");
		/*response.addHeader("Content-Disposition", "attachment; filename="
				+ filename + ".xls");*/
		try {
			retValue.write();
			retValue.close();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (WriteException e) {
			e.printStackTrace();
		}
	}
}

2.4、在web.xml文件中添加servlet配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>	
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
  	<servlet-name>ExportExlServlet</servlet-name>
  	<servlet-class>servlet.ExportExlServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>ExportExlServlet</servlet-name>
  	<url-pattern>/ExportExlServlet</url-pattern>
  </servlet-mapping>
</web-app>

2.5、添加index.jsp請求servlet

<body>
    This is my JSP page. <br>
    <a href="ExportExlServlet">導出數據</a>
  </body>

  導出結果:

 源碼下載地址:https://github.com/ablejava/Jxl-Excel


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • DBCP連接池簡介 1、資料庫連接基礎 資料庫連接池基礎主要包括以下三個方面的內容:資料庫連接池的基本概念、資料庫連接池的工作原理、Java開源的連接池。下麵將從這三個方面一一介紹: (1)資料庫連接池的基本概念 資料庫連接是一種關鍵的、有限的、昂貴的資源,這一點在多用戶的Web應用程式中體現得尤為 ...
  • 這篇博客總結了半天,希望自己以後返回來看的時候理解更深刻,也希望可以起到幫助初學者的作用. 轉載請註明 出自 : "luogg的博客園" , 抽象 一種專門用來做父類,被繼承的. (模板) 格式: abstract class 抽象類名{ 屬性; 普通方法; 訪問許可權 abstract 返回值類型 ...
  • 在 Python 的Lib目錄里有一個:this.Py (或者在互動式解釋器中輸入import this) 它其實是隱藏的一首詩 ...
  • 題目是說給出一個數字,然後以1到這個數為序號當做二叉樹的結點,問總共有幾種組成二叉樹的方式。這個題就是用卡特蘭數算出個數,然後因為有編號,不同的編號對應不同的方式,所以結果是卡特蘭數乘這個數的階乘種方案。因為數字比較大,所以要用高精度的方法也就是用字元數組來做,我分別寫了三個函數,一個算加法,一個算 ...
  • 傳送門:hdu 5862 Counting Intersections 題意:對於平行於坐標軸的n條線段,求兩兩相交的線段對有多少個,包括十,T型 官方題解:由於數據限制,只有豎向與橫向的線段才會產生交點,所以先對橫向線段按x端點排序,每次加入一個線段,將其對應的y坐標位置+1,當出現一個豎向線段時 ...
  • django提供了一套用戶驗證系統,但是要使用這個系統,必須要使用django內置的用戶模型:django.contrib.auth.models.User,這個模型中預先定義了一些欄位,其中只有username和password是必須的。 username 用戶名,該欄位是必須的,長度限製版本之間 ...
  • Hashtable Hashtable 的實例有兩個參數影響其性能:初始容量 和載入因數。容量 是哈希表中桶 的數量,初始容量就是哈希表創建時的容量。註意,哈希表的狀態為 open:在發生“哈希衝突”的情況下,單個桶會存儲多個條目,這些條目必須按順序搜索。載入因數 是對哈希表在其容量自動增加之前可以 ...
  • --> 在多線程複製的基礎上加入斷點續傳的功能 -->Test 測試類 --> MyThread 線程實現類 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...