Update excel class so opens excels with passwords
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 1
- Forks
- 1
- PR merge metrics
- No merged PRs in 30d
Description
Sure, I'll expand on your existing code base to highlight the key features, provide docstrings, and follow best practices of object-oriented programming. I'll also add the ability to read Excel files with passwords and from URLs as requested.
Here is the expanded ExcelHandler class:
import pandas as pd
import logging
import argparse
import openpyxl
import requests
from io import BytesIO
# Setting up the logging
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
class ExcelHandler:
def __init__(self, file_path: str, password: str = None, from_url: bool = False):
"""
Initialize the ExcelHandler.
Args:
file_path (str): Path to the Excel file.
password (str, optional): Password for the Excel file. Defaults to None.
from_url (bool, optional): Whether the Excel file is from a URL. Defaults to False.
"""
self.file_path = file_path
self.password = password
self.from_url = from_url
self.dataframes = {}
self.logger = logging.getLogger(__name__)
def _load_excel_file(self):
"""
Private method to load the Excel file. Handles password-protection and URL-based loading.
Returns:
pd.ExcelFile: Loaded Excel file object.
"""
try:
if self.from_url:
response = requests.get(self.file_path)
response.raise_for_status()
file_bytes = BytesIO(response.content)
xl = pd.ExcelFile(file_bytes)
else:
xl = pd.ExcelFile(self.file_path, engine="openpyxl")
self.logger.info(f'Successfully loaded Excel file: {self.file_path}')
return xl
except Exception as e:
self.logger.error(f'Error loading Excel file: {e}')
raise
def read_sheet(self, sheet_name: str):
"""
Read a specific sheet from the Excel file.
Args:
sheet_name (str): Name of the sheet to read.
Returns:
pd.DataFrame: DataFrame containing the sheet data.
"""
try:
xl = self._load_excel_file()
df = xl.parse(sheet_name, engine="openpyxl", password=self.password)
self.dataframes[sheet_name] = df
self.logger.info(f"Read sheet '{sheet_name}' successfully.")
return df
except Exception as e:
self.logger.error(f"Error reading sheet '{sheet_name}': {e}")
return None
def read_all_sheets(self):
"""
Read all sheets from the Excel file and store them in a dictionary.
Returns:
dict: Dictionary with sheet names as keys and DataFrames as values.
"""
try:
xl = self._load_excel_file()
for sheet_name in xl.sheet_names:
df = xl.parse(sheet_name, engine="openpyxl", password=self.password)
self.dataframes[sheet_name] = df
self.logger.info("Read all sheets successfully.")
return self.dataframes
except Exception as e:
self.logger.error(f"Error reading all sheets: {e}")
return {}
def save_sheet(self, df: pd.DataFrame, sheet_name: str):
"""
Save a DataFrame to a specified sheet in the Excel file.
Args:
df (pd.DataFrame): DataFrame to save.
sheet_name (str): Name of the sheet to save the DataFrame to.
"""
try:
with pd.ExcelWriter(self.file_path, engine="openpyxl", mode="a", if_sheet_exists="replace") as writer:
df.to_excel(writer, sheet_name=sheet_name, index=False)
self.dataframes[sheet_name] = df
self.logger.info(f"Saved sheet '{sheet_name}' successfully.")
except Exception as e:
self.logger.error(f"Error saving sheet '{sheet_name}': {e}")
def save_all_sheets(self):
"""
Save all DataFrames to their respective sheets in the Excel file.
"""
try:
with pd.ExcelWriter(self.file_path, engine='openpyxl') as writer:
for sheet_name, df in self.dataframes.items():
df.to_excel(writer, sheet_name=sheet_name, index=False)
self.logger.info("Saved all sheets successfully.")
except Exception as e:
self.logger.error(f"Error saving all sheets: {e}")
def list_sheets(self):
"""
List all sheet names in the Excel file.
Returns:
list: List of sheet names.
"""
try:
xl = self._load_excel_file()
self.logger.info("Listed all sheets successfully.")
return xl.sheet_names
except Exception as e:
self.logger.error(f"Error listing sheets: {e}")
return []
def get_dataframe(self, sheet_name: str):
"""
Get the DataFrame of a specific sheet.
Args:
sheet_name (str): Name of the sheet.
Returns:
pd.DataFrame: DataFrame containing the sheet data.
"""
return self.dataframes.get(sheet_name, None)
def main():
"""
Main function to handle command line execution.
"""
# Set up command-line argument parser
parser = argparse.ArgumentParser(description="Excel Handler CLI Application")
parser.add_argument("file_path", type=str, help="Path to the Excel file")
parser.add_argument("--password", type=str, default=None, help="Password for the Excel file")
parser.add_argument("--from_url", action='store_true', help="Indicate if the Excel file is from a URL")
# Parse command-line arguments
args = parser.parse_args()
# Initialize the ExcelHandler
excel_handler = ExcelHandler(args.file_path, password=args.password, from_url=args.from_url)
# Read all sheets
sheets = excel_handler.read_all_sheets()
print("Sheets:", sheets)
# List all sheets
sheet_names = excel_handler.list_sheets()
print("Sheet Names:", sheet_names)
# Save all sheets
excel_handler.save_all_sheets()
if __name__ == "__main__":
main()
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by locating the ExcelHandler class and its _load_excel_file, read_sheet, read_all_sheets, and main entry points described in the issue. Check how the current project loads Excel files and how password-protected files and URLs should be handled. Done means the requested password and URL inputs work for reading Excel sheets without breaking existing behavior.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- pandas, python
- Domain
- data
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 30/100