1. 程式人生 > >獲取EXCEL中對應的列英文字母識別符號(字母序列/列標題)(JAVA實現)

獲取EXCEL中對應的列英文字母識別符號(字母序列/列標題)(JAVA實現)

如果您有興趣,可以繼續閱讀!

最近的一個專案中客戶有這麼一個需求:讀取EXCEL檔案的時候,需要做一些處理,但當處理某個單元格時如果發生異常需要記錄是哪個單元格導致的異常,並且以列標題(字母+數字的)形式表示是哪個單元格 比如是 第7行第6列的單元格出錯,則會記錄 "F7 XXXX".

我們都知道JAVA 中有很多工具類可以處理很多型別的文件,比如 Workbook 類。但我發現 該類並沒有獲取EXCEL中對應的列英文字母標題(字母序號/列標題)的方法 如果我要獲取第7行第6列的單元格編號"F7"是行不通的,只能記錄 “第7行第6列 XXX” 這樣的資訊,不直觀。所以最後還是決定自己動手實現。目前最主要的任務就是獲取 第N列對應的字母序列.

過程:因為字母是26位的,所以我第一印象採取的方式就是,類似10進位制轉16進位制的方法。後來發現,這樣行不通,總有些字母序列表示不出來. 最主要是因為 0 這個特殊的數字 0 和 00等同,假設 A代表0 那麼 AA代表00 這樣在數值上 A和AA相等,但在Excel中 A標識第一列 AA標識的是第27列。

   後來我把這些字母序號寫在紙上,發現了一個規律,他們都是以26n為一個區塊,這樣的話,我就看是否能採用類似計算檔案系統偏移地址的方式來計算出來。後來成功了!

    首先 確定字母有幾位

    A以0開始的,如果從1開始 則Z為26,給後面兩位時計算帶來麻煩

    因為 A=0 時Z=25 A/26=0 Z/26=0 在一個範圍內,

    而A=1 時 Z=26 A/26=0 Z/26=1 在兩個範圍內。

    然後我們以26n為一個區塊,找出每個區塊的 起始地址(應該是對應出現的個數-1) 和 結束地址

    發現 N個字母的起始地址為

    A0=0     大小26

    AA0=26  大小262

    AAA0=26*26+26 大小263

    AAAA0=26*26*26+26*26+26 大小26n

    A(n)A0=26n-1+26n-2...+26=26*(26n-1)/25 (等比數列求和)大家可以在紙上按以上的分法畫出區塊圖!

    這樣便可以計算出有幾個字母了-》公式:  n= (log25*num/26+1)/log26的整數部分+1

    然後我們找出num對應最大區塊的偏移(多出字母標題的個數)sub= num-26*(26n-1-1)/25;

    這時便可以算出第一個字母是什麼 An=sub/26n-1 因為多出來的部分會包含若干個前面的區塊

對於求後面的An-1 也要先算出偏移 這裡用求餘也可以算出 sub=sub%26n-1 (26n-1是這個區塊的大小)

    然後求出 包含了多少前面的區塊 An-1=sub/26n-2

依次類推 直到求出 最後一個字母。

  JAVA原始碼:

 //get the Label of Excel Column,parameter num is which num,it start from ‘0’

 public static String getExcelColumnLabel(int num){
    String temp="";

    //make sure how many letters are there
    double i=Math.floor(Math.log(25.0*(num)/26.0+1)/Math.log(26))+1;
    if(i>1){
     double sub=num-26*(Math.pow(26, i-1)-1)/25;
     for(double j=i;j>0;j--){
      temp= temp+(char)(sub/Math.pow(26, j-1)+65);
      sub=sub%Math.pow(26, j-1);
     }
    }else{
     temp= temp+(char)(num+65);
    }
    return temp;
 }

測試:

 public static void main(String[] args){
  for(int i=1;i<=26*26*26*26+26*26*26+26*26+26;i++){
    if((i)%26==0){
     System.out.print("["+getExcelColumnLabel(i-1)+"]/n");
    }else{
     System.out.print("["+getExcelColumnLabel(i-1)+"]");
    }
     }
 }

注意:我的起始列是從 0 開始,

如果你是從1開始,需要把輸入引數減去1

比如你要輸出第27列對應的 字母標題

那麼輸入引數 是27-1=26

呼叫如下

System.out.print("["+getExcelColumnLabel(26)+"]");
 

好了 大家可以把程式碼copy下來 測試下,這是我第一次在CSDN上發表技術類的文章,有什麼錯誤或不理解的還請大家指出。另外我的方法應該不是最好的,最高效的,如果哪位高手還有更好的方法,歡迎跟帖指出!TKS

相關推薦

獲取EXCEL對應英文字母識別符號(字母序列/標題)(JAVA實現)

如果您有興趣,可以繼續閱讀! 最近的一個專案中客戶有這麼一個需求:讀取EXCEL檔案的時候,需要做一些處理,但當處理某個單元格時如果發生異常需要記錄是哪個單元格導致的異常,並且以列標題(字母+數字的)形式表示是哪個單元格 比如是 第7行第6列的單元格出錯,則會記錄 "F

python學習第一週 獲取字串出現次數最多的字母

給定一個包含不同的英文字母和標點符號的文字,找出其中出現最多的字母,檢測時不區分大小寫,並返回一個小寫字母,若存在相同次數的字母,則返回字母表中最先出現的那個。比如find,則返回f #!/usr/bin/python3 #-*- coding:UTF-8 -*- str_input = in

基於BootStrap的initupload()實現Excel上傳和獲取excel的數據

增強for循環 function tail throws tab https pow preview layer 簡單說明:後邊要做exl解析(還沒做呢),所以先有一個excel的的上傳以及獲取excel中的數據,展示出來。 代碼: //html代碼 <div c

C#實戰020:OleDb操作-獲取Excel的sheet工作表

          前面用Excel元件寫了一個程式,用來計算市場部的刀具使用明細,但是 發現整個計算過程頻繁的操作Excel表,導致計算時間較長,資料不怎麼多 卻話費了3-4分鐘的計算時間,所以效率太低了。     &

c#獲取excel的所以sheet名稱(自用筆記)

Excel.Application myExcel = new Excel.Application(); object missing = System.Reflection.Missing.Value; myExcel.Application.Workbooks.Ope

java獲取excel資料並存入資料庫表

1--獲取excel檔案檔案所在路徑       由於公司的平臺框架封裝比較嚴重,獲取路徑方法可能略有不同,不必太放心上。 //獲取平臺附件配置檔案附件存放路徑 String realPath = F

JS獲取字串出現次數最多的字母,常用方法

(1)陣列+物件 <script > var str = 'aafcbad'; var obj = {}; var arr = []; var letter; for(var i = 0,len

c#獲取excel的所以sheet名稱

Excel.Application myExcel = new Excel.Application(); object missing = System.Reflection.Missing.Value; myExcel.Application.Workbooks.Op

python 獲取字串出現次數最多的字母

獲取字串中出現次數最多的字母        給定一個包含不同的英文字母和標點符號的文字,找出其中出現最多的字母,不區分大小寫,並返回一個小寫字母,若存在相同次數的字母,則返回字母表中最先出現的那個。 採用內建函式max import string

java獲取excel資料,並轉化為JSON格式

java通過poi讀取execl檔案,並且將其中的map格式和陣列格式的字串,轉化為相應的資料型別。 引入poi庫 讀取execl資料,轉化為json字串 將其中的map格式和陣列格式的字串,轉化為相應的資料型別 引入poi庫: <depen

獲取Excel的圖片

找到 獲取 一份 copy inf 圖片 怎麽辦 bsp 子文件夾 如下圖,上傳要獲取這裏面的圖片,而又不能直接選擇,怎麽辦呢? 1.首先復制一份Excel文件命名copy.xlsx 2.修改copy.xlsx文件的後綴名變成copy.rar 3.解壓cop

init.rc文件面啟動c++程序,通過jni調用java實現

mini val sni ril urn runtime sport mco env </pre><p>註:假設是自己的myself.jar包,還要修改例如以下:</p><p>target/product/core_bas

Java】 劍指offer(43) 從1到n整數1出現的次數 《劍指Offer》Java實現合集 《劍指Offer》Java實現合集

本文參考自《劍指offer》一書,程式碼採用Java語言。 更多:《劍指Offer》Java實現合集   題目   輸入一個整數n,求從1到n這n個整數的十進位制表示中1出現的次數。例如輸入12,從1到12這些整數中包含1 的數字有1,10,11和12,1一共出現了5次。 思路

Excel日期/時間儲存數值轉換為具體日期/時間(java實現

在用POI的事件模型eventusermodel讀取大容量Excel時發現讀取的日期、時間格式輸出後是浮點數字符串,然而沒有找到有類似於usermodel的分格式讀取的方法,於是編寫一個工具類,把獲取的浮點數轉換成日期/時間格式,增加可用性。 Excel用浮點

二叉樹的前序遍歷,序遍歷,後序遍歷(Java實現

1.前序遍歷    前序遍歷(DLR,lchild,data,rchild),是二叉樹遍歷的一種,也叫做先根遍歷、先序遍歷、前序周遊,可記做根左右。前序遍歷首先訪問根結點然後遍歷左子樹,最後遍歷右子樹。前序遍歷首先訪問根結點然後遍歷左子樹,最後遍歷右子樹。在遍歷左、右子樹時,

在柱狀圖找最大矩形——O(n)時間複雜度java實現

最近在刷leetcode,又碰到了這道題,想起來當時演算法有些瑕疵,所以將最新的AC程式碼更新在最上面做個對比,具體思路見註釋. public class Solution { // 思路: 主要是使用一個棧來儲存陣列元素的下標,注意是儲存‘下標’。

Excel如何獲取漢字拼音首字母?

轉自:https://jingyan.baidu.com/article/0a52e3f43c3f6abf63ed7259.html百度經驗 在Excel中如何獲取漢字拼音首字母?|      在工作中,為了方便查詢、排序或者編碼,需要生成漢字內容

EXCEL如何讓一數字變成文本格式?就是想讓單元格的左上角變一個綠綠的?

excel image 一個 splay wid 宋體 文本格式 margin -1 如何在EXCEL中如何讓一列數字變成文本格式?就是想讓單元格的左上角變一個綠綠的? 解決方案:將整列單元格格式設為文本,然後,選中該列,數據--分列--完成 詳細步驟: (1)選中1行或者

Css如何使英文和拼音變成全大寫、全小寫和首字母大寫?

如何 iii yiq cfg css html dsv body omr 想要實現英文和中文拼音變成全大寫、全小寫和首個字母大寫,需要用到 css中text-transform樣式屬性,接下來介紹一下 1、text-transform的值 1)Capitalize:英文拼音

如何將excel的4變成4行?

如何將excel中的4列變成4行?用鼠標選中4個單元格,然後再在輸入框中輸入公式 =IF({1},OFFSET($A$1:$D$1,(COLUMN(A2)-1)/4+(ROW(A1)-1)*3,)) 同時按三鍵(ctrl+shift+enter) 右拉,下拉,就行了其中 $A$1:$D$1 代表數據來源