讀取excel源碼
『壹』 如何用Apache POI讀取Excel
首先POI是開源組織Apache出品的一個開源jar包,提供了方便解析Excel的API,我們可以非常方便的使用它來讀取Excel。這里介紹3.5Final版本。
所需用到的jar包如下:
說到Excel,有2003和2007,格式是不一樣的,用POI解析的方法也就不一樣,Excel2003主要是使用org.apache.poi.hssf.usermodel包中的類來解析,而Excel2007就是使用org.apache.poi.xssf.usermodel來解析。
解析Excel2003源碼
說到Excel,有2003和2007,格式是不一樣的,用POI解析的方法也就不一樣,Excel2003主要是使用org.apache.poi.hssf.usermodel包中的類來解析,而Excel2007就是使用org.apache.poi.xssf.usermodel來解析。
解析Excel2003源碼
StringBuffer content = new StringBuffer();
HSSFWorkbook workbook = new HSSFWorkbook(is); // 創建對Excel工作簿文件的引用
for (int numSheets = 0; numSheets < workbook.getNumberOfSheets(); numSheets++) {
if (null != workbook.getSheetAt(numSheets)) {
HSSFSheet aSheet = workbook.getSheetAt(numSheets); // 獲得一個sheet
for (int rowNumOfSheet = 0; rowNumOfSheet <= aSheet.getLastRowNum(); rowNumOfSheet++) {
if (null != aSheet.getRow(rowNumOfSheet)) {
HSSFRow aRow = aSheet.getRow(rowNumOfSheet); // 獲得一行
for (int cellNumOfRow = 0; cellNumOfRow <= aRow.getLastCellNum(); cellNumOfRow++) {
if (null != aRow.getCell(cellNumOfRow)) {
HSSFCell aCell = aRow.getCell(cellNumOfRow); // 獲得列值
if (aCell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
content.append(aCell.getNumericCellValue() + " ");
} else if (aCell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN) {
content.append(aCell.getBooleanCellValue() + " ");
} else if (aCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
content.append(aCell.getStringCellValue() + " ");
} else if (aCell.getCellType() == HSSFCell.CELL_TYPE_FORMULA){
content.append(aCell.getCellFormula() + " ");
} else {
continue;
}
}
if(cellNumOfRow == aRow.getLastCellNum()) {
content.append("
");
}
}
}
}
}
}
return content.toString().trim();
解析Excel2007和2003基本一樣,只是將HSSFSheet,HSSFCell等都改成XSSFSheet,XSSFCell即可。
另外要提醒大家的是Excel的樣式都是基於一個單元格的,所以用HSSFRow.getRowStyle()拿樣式會出問題的,不一定會拿到你想要的樣式。處理合並單元格是POI的一個難點,只能通過判斷當前單元格是否在合並單元格之中,如果是,那此單元格的值便是這個合並單元格的首位置單元格的值,只有通過這樣才能來處理合並單元格。
處理合並單元格的代碼:
public static boolean isMergedRegion(HSSFSheet sheet, HSSFCell cell) {
//得到一個sheet中有多少個合並單元格
int sheetmergerCount = sheet.getNumMergedRegions();
for(int i = 0; i < sheetmergerCount; i++) {
//得出具體的合並單元格
CellRangeAddress ca = sheet.getMergedRegion(i);
//得到合並單元格的起始行, 結束行, 起始列, 結束列
int firstC = ca.getFirstColumn();
int lastC = ca.getLastColumn();
int firstR = ca.getFirstRow();
int lastR = ca.getLastRow();
//判斷該單元格是否在合並單元格範圍之內, 如果是, 則返回 true
if(cell.getColumnIndex() <= lastC && cell.getColumnIndex() >= firstC) {
if(cell.getRowIndex() <= lastR && cell.getRowIndex() >= firstR) {
return true;
}
}
}
return false;
}
public static String getMergedRegionValue(HSSFSheet sheet, HSSFCell cell) {
//獲得一個 sheet 中合並單元格的數量
int sheetmergerCount = sheet.getNumMergedRegions();
//便利合並單元格
for(int i = 0; i < sheetmergerCount; i++) {
//獲得合並單元格
CellRangeAddress ca = sheet.getMergedRegion(i);
//獲得合並單元格的起始行, 結束行, 起始列, 結束列
int firstC = ca.getFirstColumn();
int lastC = ca.getLastColumn();
int firstR = ca.getFirstRow();
int lastR = ca.getLastRow();
//判斷該單元格是否是在合並單元格中, 如果是, 則返回所在合並單元格的首單元格的值
if(cell.getColumnIndex() <= lastC && cell.getColumnIndex() >= firstC) {
if(cell.getRowIndex() <= lastR && cell.getRowIndex() >= firstR) {
HSSFRow fRow = sheet.getRow(firstR);
HSSFCell fCell = fRow.getCell(firstC);
//除了合並單元格首單元格的值, 其餘的用(*)來區分
if (fCell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC && hasBorder(cell)) {
return String.valueOf(fCell.getNumericCellValue());
} else if (fCell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN && hasBorder(cell)) {
return String.valueOf(fCell.getBooleanCellValue());
} else if (fCell.getCellType() == HSSFCell.CELL_TYPE_STRING && hasBorder(cell)) {
return fCell.getStringCellValue();
} else if (fCell.getCellType() == HSSFCell.CELL_TYPE_FORMULA && hasBorder(cell)){
return String.valueOf(fCell.getCellFormula());
}
}
}
}
return "";
}
『貳』 別人用excel表格做的管理系統怎麼查看此管理系統的源碼
新建excel文件,alt+F11進入VBA編輯器,插入模塊,輸入以下代碼:
Sub MoveProtect()
Dim FileName As String
FileName = Application.GetOpenFilename("Excel文件(*.xls & *.xla),*.xls;*.xla", , "VBA破解")
If FileName = CStr(False) Then
Exit Sub
Else
VBAPassword FileName, False ' 引用下面的自定義函數
End If
End Sub
Private Function VBAPassword(FileName As String, Optional Protect As Boolean = False)
If Dir(FileName) = "" Then
Exit Function
Else
FileCopy FileName, FileName & ".bak"
End If
Dim GetData As String * 5
Open FileName For Binary As #1
Dim CMGs As Long
Dim DPBo As Long
For i = 1 To LOF(1)
Get #1, i, GetData
If GetData = "CMG=""" Then CMGs = i
If GetData = "[Host" Then DPBo = i - 2: Exit For
Next
If CMGs = 0 Then
MsgBox "請先對VBA編碼設置一個保護密碼...", 32, "提示"
Exit Function
End If
If Protect = False Then
Dim St As String * 2
Dim s20 As String * 1 '取得一個0D0A十六進制字串
Get #1, CMGs - 2, St '取得一個20十六制字串
Get #1, DPBo + 16, s20 '替換加密部份機碼
For i = CMGs To DPBo Step 2
Put #1, i, St
Next '加入不配對符號
If (DPBo - CMGs) Mod 2 <> 0 Then
Put #1, DPBo + 1, s20
End If
MsgBox "文件解密成功......", 32, "提示"
Else
Dim MMs As String * 5
MMs = "DPB="""
Put #1, CMGs, MMs
MsgBox "對文件特殊加密成功......", 32, "提示"
End If
Close #1
End Function
2. 運行上面的代碼,選擇你的文件,移除密碼成功後打開文件,按alt+F11查看源碼:
『叄』 excel怎麼看vba源代碼
按ALT+F11,可以進入VBE編輯界面。
或者功能區按鈕,可參考:
Excel-VBA基礎(1):如何在菜單欄顯示「開發工具」