1. บทนำ การพิมพ์รายงานมักเป็นโมดูลที่สำคัญในระบบข้อมูลการจัดการ และมีการใช้ Excel กันอย่างแพร่หลายในการพิมพ์รายงาน เนื่องจากมีฟังก์ชันอันทรงพลัง แอปพลิเคชันที่ยืดหยุ่น และความสามารถรอบด้านที่แข็งแกร่ง
โดยทั่วไประบบข้อมูลการจัดการได้รับการพัฒนาโดยใช้โมเดลไคลเอ็นต์/เซิร์ฟเวอร์ (C/S) อย่างไรก็ตาม ด้วยการประยุกต์ใช้ WWW อย่างแพร่หลาย ระบบข้อมูลการจัดการในปัจจุบันจึงค่อยๆ เริ่มเปลี่ยนจากโมเดล C/S ไปเป็นเบราว์เซอร์/เซิร์ฟเวอร์ (B /S) การเปลี่ยนโหมด โหมด B/S มีคุณสมบัติมากมายที่โหมด C/S แบบดั้งเดิมไม่สามารถเทียบได้ เช่น เปิดกว้างมากขึ้น เป็นอิสระจากซอฟต์แวร์และฮาร์ดแวร์ สะดวกสำหรับการขยายแอปพลิเคชันและการบำรุงรักษาและอัปเกรดระบบ เป็นต้น ขณะนี้โหมดนี้กลายเป็นโหมดการประมวลผลที่ต้องการแล้ว สำหรับเครือข่ายองค์กร เดิมทีใช้ใน C/S ซอฟต์แวร์จำนวนมากบนอินเทอร์เน็ตได้เริ่มถูกย้ายไปยังโหมด B/S เนื่องจากลักษณะพิเศษของโหมด B/S ฟังก์ชันการพิมพ์รายงาน Excel ที่ใช้งานง่ายภายใต้ C/S จึงกลายเป็นปัญหาภายใต้ B/S บทความนี้ให้วิธีการทั่วไปที่ดีกว่าโดยยึดตามประสบการณ์ที่สรุปไว้ในโครงการจริง โดยใช้ ASP เป็นตัวอย่าง
2. การใช้งานฟังก์ชัน เพื่ออธิบายปัญหา นี่คือตัวอย่าง แพลตฟอร์มระบบคือ Windows 2000+SQL Server 2000+IIS 5.0+ASP 3 รายงานใช้ Excel จำเป็นต้องสร้างรายงานสถิติการขายหนังสือตามรูปแบบรายงานที่กำหนดและสามารถพิมพ์ได้
2.1 การสร้างเทมเพลตรายงาน Excel ขั้นแรกให้สร้างเทมเพลต Excel (นั่นคือรูปแบบของรายงานที่จะพิมพ์) ตามรูปแบบรายงานที่กำหนด แน่นอนว่าข้อมูลที่สร้างจากสถิติแบบไดนามิกในฐานข้อมูลควรเว้นว่างไว้ รายงานนี้วาดขึ้นครั้งแรกใน Excel จากนั้นจึงบันทึกเป็นเทมเพลต และเก็บไว้ที่นี่ ที่นี่ในชื่อ testbook1.xlt
2.2 การสร้างและการพิมพ์รายงาน Excel มีการใช้ส่วนประกอบแอปพลิเคชันของ Excel ที่นี่ ซึ่งได้รับการติดตั้งในระบบเมื่อติดตั้ง Excel การดำเนินงานของเรามีเป้าหมายอยู่ที่ส่วนนี้ด้วย
(1) สร้างวัตถุ Excel.Application
ตั้ง objExcel=CreateObject("Excel.Application")
(2) เปิดเทมเพลต Excel
objExcel.Workbooks.Open(server.mappath("test")&"book1.xlt") 'เปิดเทมเพลต Excel
objExcel.Sheets(1).select 'เลือกหน้างาน'
ชุด sheetActive = objExcel.ActiveWorkbook.ActiveSheet
(3) การดำเนินการเพิ่มตามปกติของ Excel เช่น sheetActive.range("g4").value=date() 'สิ่งที่เพิ่มที่นี่คือเวลา แน่นอนว่าอาจเป็นข้อมูลใดก็ได้ที่คุณระบุด้วย
(4) เพิ่มบันทึกในฐานข้อมูลใน Excel ถือว่ามีชุดข้อมูล adoRset อยู่แล้ว ซึ่งเก็บข้อมูลทางสถิติที่สร้างโดยการดำเนินการ Sql
num=7 'เริ่มจากแถวที่เจ็ดของ Excel
ทำจนกระทั่ง adoRset.EOF 'วนซ้ำจนกว่าข้อมูลในชุดข้อมูลจะถูกเขียน
strRange="d"&num&":f"&num 'กำหนดพื้นที่หน่วยเพื่อเติมเนื้อหา
sheetActive.range(strRange).font.size=10 'ตั้งค่าขนาดตัวอักษร
sheetActive.range(strRange).WrapText=false 'ตั้งค่าการตัดข้อความ
sheetActive.range(strRange).ShrinkToFit=true 'ตั้งค่าว่าจะปรับให้เข้ากับขนาดหน่วยตารางโดยอัตโนมัติหรือไม่
sheetActive.range(strRange).value=array(adoRset("bookid"),adoRset("bookname"),adoRset("author")) 'กรอกข้อมูลในชุดข้อมูลลงในหน่วยที่เกี่ยวข้อง
หมายเลข=หมายเลข+1
adoRset.MoveNext
วนซ้ำ
(5) การบันทึกและการประมวลผลไฟล์รายงานชั่วคราวของ Excel ในการทำงานจริง ควรสังเกตว่าทุกครั้งที่ผู้ใช้พิมพ์รายงาน ไฟล์ Excel ชั่วคราวจะถูกนำมาใช้แทนการระบุชื่อไฟล์อย่างเข้มงวด เพราะหากชื่อไฟล์คงที่คือ ใช้เฉพาะครั้งแรกเท่านั้น เมื่อสร้างสำเร็จ การดำเนินการในภายหลังจะล้มเหลวเนื่องจากมีไฟล์ชื่อเดียวกันอยู่แล้ว ดังนั้นเราจึงจำเป็นต้องสร้างชื่อไฟล์ชั่วคราวและไม่ซ้ำกันทุกครั้ง ที่นี่เราสามารถใช้ฟังก์ชัน getTemporaryFile() แบบกำหนดเองเพื่อสร้างมันขึ้นมา จากนั้นจัดเก็บไว้ในชื่อไฟล์ตัวแปร และใช้ filepos ตัวแปรเพื่อแสดงเส้นทางของสิ่งเหล่านี้ ไฟล์ชั่วคราว
นอกจากนี้ หากไฟล์ชั่วคราวเหล่านี้ไม่ได้รับการประมวลผล ไฟล์เหล่านั้นจะกลายเป็นไฟล์ขยะเมื่อเวลาผ่านไป ดังนั้น เมื่อผู้ใช้แต่ละรายส่งคำขอพิมพ์รายงาน Excel ไฟล์การพิมพ์ชั่วคราวที่สร้างขึ้นก่อนหน้านี้ทั้งหมดในไดเร็กทอรีชั่วคราวจะต้องถูกลบออกก่อน
รหัสหลักสำหรับการประมวลผลไฟล์ชั่วคราวมีดังนี้:
ฟังก์ชั่น getTemporaryFile (myFileSystem)
dimtempFile,dotPos
tempFile=myFileSystem.getTempName
dotPos=instr(1,tempFile,".")
getTemporaryFile=mid(tempFile,1,dotPos)&"xls"
ฟังก์ชั่นสิ้นสุด
ตั้งค่า myFs=createObject("scripting.FileSystemObject")
filePos=server.mappath("test") & "tmp" 'ไดเร็กทอรีชั่วคราวสำหรับจัดเก็บไฟล์การพิมพ์ชั่วคราว
fileName=getTemporaryFile(myFs) 'รับชื่อไฟล์ชั่วคราว
myFs.DeleteFile filePos&"*.xls" 'ลบไฟล์การพิมพ์ชั่วคราวทั้งหมดที่สร้างขึ้นในไดเร็กทอรีนี้
ตั้งค่า myFs=nothing
รหัสบันทึกสำหรับไฟล์ชั่วคราวของ Excel คือ:
objExcel.ActiveWorkbook.saveas filePos&ชื่อไฟล์
(6) ออกจากแอปพลิเคชัน Excel
objExcel.ออก
ตั้ง objExcel = ไม่มีอะไร
(7) การพิมพ์รายงาน Excel ขั้นตอนก่อนหน้านี้ได้สร้างรายงาน Excel สำหรับการพิมพ์ในขั้นตอนถัดไป มีสองกลยุทธ์:
ตัวเลือกที่ 1: ระบุลิงก์ไปยังไฟล์ชั่วคราวของรายงาน Excel ที่สร้างขึ้นด้านบนให้กับผู้ใช้ ผู้ใช้สามารถคลิกโดยตรงเพื่อเปิดรายงาน Excel ในเบราว์เซอร์และพิมพ์ผ่านฟังก์ชันการพิมพ์ของเบราว์เซอร์ นอกจากนี้ยังสามารถคลิกขวาและบันทึกได้อีกด้วย มันในพื้นที่สำหรับการพิมพ์ ฯลฯ จัดการด้วย
ตัวเลือกที่ 2: หลังจากสร้างรายงาน Excel แล้ว ให้โหลดลงในเบราว์เซอร์ทางฝั่งไคลเอ็นต์โดยตรง เมื่อโหลดไม่ครบถ้วน ควรแสดงข้อความ "กำลังโหลด โปรดรอสักครู่" และคำอื่นๆ
2.3 การกำหนดค่าระบบและข้อควรระวัง แม้ว่าโค้ดข้างต้นจะง่ายมาก แต่ข้อผิดพลาดมักจะเกิดขึ้นหากไม่ได้ใช้อย่างถูกต้องในทางปฏิบัติ ดังนั้นการกำหนดค่าระบบและข้อควรระวังที่กล่าวถึงด้านล่างจึงมีความสำคัญมาก
(1) ตรวจสอบให้แน่ใจว่าอินพุตโค้ดข้างต้นถูกต้อง ไม่เช่นนั้นเมื่อเกิดข้อผิดพลาดในการดำเนินการ วัตถุ Excel จะยังคงอยู่ในหน่วยความจำและจะกำจัดได้ยาก ทำให้การโทรครั้งถัดไปช้ามากและสร้างข้อผิดพลาดของ Windows หน่วยความจำไม่สามารถอ่านหรือเขียนได้ วิธีแก้ไขในเวลานี้คือการออกจากระบบของผู้ใช้ปัจจุบัน หากไม่ได้ผล คุณสามารถรีเซ็ตได้เท่านั้น
(2) ตรวจสอบให้แน่ใจว่าได้ตั้งค่าการอนุญาตของไฟล์ asp ที่รับผิดชอบฟังก์ชันการพิมพ์ วิธีการคือ: ในการจัดการ IIS ให้เลือกไฟล์ asp คลิกขวาและเลือก "Properties"/"File Security"/"Anonymous Access and Authentication Control" ที่นี่ IIS จะมีค่าเริ่มต้นเป็นการเข้าถึงแบบไม่ระบุชื่อ และคุณควรเลือกการเข้าถึงที่ผ่านการรับรองความถูกต้อง ( นี่คือการตรวจสอบสิทธิ์ขั้นพื้นฐาน สามารถใช้ทั้งสองวิธีและการตรวจสอบสิทธิ์ Windows แบบรวมได้ แต่วิธีแรกไม่ปลอดภัยเพียงพอ) นี่เป็นสิ่งสำคัญอย่างยิ่ง ไม่เช่นนั้นจะเกิดข้อผิดพลาดในแอปพลิเคชัน
(3) บางครั้งรายงานถูกแบ่งออกเป็นหลายหน้า และเราต้องการให้แต่ละหน้ามีส่วนหัวเดียวกัน เรากำหนดให้พิมพ์ส่วนหัวในแต่ละหน้าโดยอัตโนมัติ ซึ่งสามารถตั้งค่าได้ในเทมเพลต Excel วิธีการมีดังนี้: เลือกเมนู "ไฟล์"/"การตั้งค่าหน้ากระดาษ"/"แผ่นงาน" จากนั้นป้อนจำนวนแถวในส่วนหัวของคุณใน "แถวชื่อบนสุด" (เช่น หากส่วนหัวคือแถว 1- 3, กรอก: $1:$3 ).
3. โดยสรุป เราได้ยกตัวอย่างการสร้างและพิมพ์รายงาน EXCEL ในโหมด B/S ที่เขียนด้วย ASP ซึ่งได้รับการนำไปใช้ในทางปฏิบัติอย่างดี ข้อเท็จจริงยังพิสูจน์ให้เห็นว่าแม้ว่าโค้ดของตัวอย่างนี้จะเขียนได้ไม่ยาก แต่คุณต้องใส่ใจกับการกำหนดค่าระบบ นี่เป็นประสบการณ์ที่ได้รับหลังจากความล้มเหลวนับไม่ถ้วน