读取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):如何在菜单栏显示“开发工具”