این مقاله نحوه تبدیل MS Excel XLS یا XLSX به Google Sheets را به صورت برنامه‌نویسی در جاوا نشان می‌دهد.

تبدیل Excel XLS یا XLSX به Google Sheets در جاوا

Google Sheets یک برنامه آنلاین محبوب است که به شما امکان می دهد اسناد صفحه گسترده ایجاد و دستکاری کنید. علاوه بر این، به شما این امکان را می دهد که صفحات گسترده را با چندین نفر در زمان واقعی به اشتراک بگذارید. بنابراین، اغلب باید داده‌ها را از کتاب‌های کار Excel به صفحه‌گسترده در Google Sheets به صورت برنامه‌نویسی صادر کنید. در این مقاله، نحوه صادرات داده‌های اکسل به Google Sheets در جاوا را توضیح خواهیم داد.

پیش نیازها - صادر کردن داده های اکسل به Google Sheets در جاوا

پروژه Google Cloud

Google Cloud یک پلت فرم رایانش ابری است که انواع مختلفی از خدمات را ارائه می دهد که می توانیم در برنامه های خود از آنها استفاده کنیم. برای استفاده از Google Sheets API، باید یک پروژه در کنسول Google Cloud ایجاد کنیم و Google Sheets API را فعال کنیم. می توانید راهنمای گام به گام [نحوه ایجاد یک پروژه Google Cloud و فعال کردن Sheets API] را بخوانید.

API های جاوا برای صادرات داده های اکسل به Google Sheets

برای صادر کردن داده‌ها از فایل‌های Excel XLS/XLSX به Google Sheets، به APIهای زیر نیاز داریم.

  • Aspose.Cells برای جاوا - To read the data from Excel files.
  • Google Client APIs for Java - برای ایجاد و به‌روزرسانی صفحات گسترده در Google Sheets.

برای نصب این API ها می توانید از تنظیمات زیر در فایل pom.xml خود استفاده کنید.

<repositories>
	<repository>
		<id>AsposeJavaAPI</id>
		<name>Aspose Java API</name>
		<url>http://repository.aspose.com/repo/</url>
	</repository>
</repositories>
<dependencies>
	<dependency>
		<groupId>com.google.api-client</groupId>
		<artifactId>google-api-client-gson</artifactId>
		<version>1.33.0</version>
	</dependency>
	<dependency>
		<groupId>com.google.oauth-client</groupId>
		<artifactId>google-oauth-client-jetty</artifactId>
		<version>1.32.1</version>
	</dependency>
	<dependency>
		<groupId>com.google.apis</groupId>
		<artifactId>google-api-services-sheets</artifactId>
		<version>v4-rev20210629-1.32.1</version>
	</dependency>
	<dependency>
		<groupId>com.aspose</groupId>
		<artifactId>aspose-cells</artifactId>
		<version>22.2</version>
	</dependency>
</dependencies>

داده های اکسل را به Google Sheets در جاوا صادر کنید

مراحل زیر برای خواندن یک فایل اکسل و سپس صادر کردن داده های آن به Google Sheets در یک برنامه کنسول جاوا است.

  1. یک برنامه جاوا (رومیزی) جدید ایجاد کنید.

  2. همانطور که در قسمت قبل ذکر شد، Aspose.Cells را برای API های Java و Google Client در پروژه نصب کنید.

  3. فایل JSON را کپی کنید ( فایلی که پس از ایجاد اعتبار در Google Cloud دانلود کرده ایم) و آن را در دایرکتوری پروژه قرار دهید.

  4. محدوده برنامه ای که مجوزهای دسترسی به برگه ها را تعریف می کند را مشخص کنید. همچنین متغیرهایی را برای مسیر دایرکتوری توکن و کارخانه JSON ایجاد کنید.

/**
 * نمونه جهانی از حوزه های مورد نیاز. اگر این محدوده ها را تغییر می دهید، حذف کنید
 * توکن‌ها/پوشه‌هایی که قبلاً ذخیره کرده‌اید.
 */
private static final String APPLICATION_NAME = "Google Sheets API Java Quickstart";
private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();
private static final String TOKENS_DIRECTORY_PATH = "tokens";
private static final List<String> SCOPES = Collections.singletonList(SheetsScopes.SPREADSHEETS);
  1. یک متد getCredentials ایجاد کنید که به کاربر با استفاده از فایل credentials مجوز می دهد.
private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
	// بارگذاری اسرار مشتری
	InputStream in = new FileInputStream(new File("credentials.json"));
	GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

	// ایجاد جریان و راه اندازی درخواست مجوز کاربر
	GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY,
			clientSecrets, SCOPES)
					.setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
					.setAccessType("offline").build();
	LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
	return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
}
  1. روش createSpreadsheet را برای ایجاد یک صفحه گسترده جدید در Google Sheets ایجاد کنید و نام صفحه پیش فرض را تنظیم کنید. این روش یک شیء صفحه گسترده را برمی گرداند.
private static Spreadsheet createSpreadsheet(Sheets _service, String spreadsheetName, String _defaultSheetName)
		throws IOException {
	// یک صفحه گسترده جدید ایجاد کنید
	Spreadsheet spreadsheet = new Spreadsheet()
			.setProperties(new SpreadsheetProperties().setTitle(spreadsheetName));

	// یک برگه جدید ایجاد کنید
	Sheet sheet = new Sheet();
	sheet.setProperties(new SheetProperties());
	sheet.getProperties().setTitle(_defaultSheetName);

	// افزودن برگه به لیست
	List<Sheet> sheetList = new ArrayList<Sheet>();
	sheetList.add(sheet);
	spreadsheet.setSheets(sheetList);

	// درخواست را اجرا کنید
	spreadsheet = _service.spreadsheets().create(spreadsheet).setFields("spreadsheetId").execute();
	System.out.println("Spreadsheet ID: " + spreadsheet.getSpreadsheetId());

	return spreadsheet;
}
  1. یک روش addSheet برای افزودن یک صفحه جدید در صفحه گسترده Google ایجاد کنید.
private static void addSheet(Sheets _service, String _spreadSheetID, String _sheetName) {
	try {
		// افزودن برگه جدید
		AddSheetRequest addSheetRequest = new AddSheetRequest();
		addSheetRequest.setProperties(new SheetProperties());
		addSheetRequest.getProperties().setTitle(_sheetName);

		// ایجاد درخواست به روز رسانی
		BatchUpdateSpreadsheetRequest batchUpdateSpreadsheetRequest = new BatchUpdateSpreadsheetRequest();
		Request req = new Request();
		req.setAddSheet(addSheetRequest);
		batchUpdateSpreadsheetRequest.setRequests(new ArrayList<Request>());
		batchUpdateSpreadsheetRequest.getRequests().add(req);

		// درخواست را اجرا کنید
		_service.spreadsheets().batchUpdate(_spreadSheetID, batchUpdateSpreadsheetRequest).execute();
	} catch (Exception e) {
		System.out.println("Error in creating sheet: " + e.getMessage());
	}
}
  1. حال متد exportExcelToGoogle را ایجاد کنید و در این روش سرویس Sheets را مقداردهی اولیه کنید.
// یک سرویس مشتری مجاز API جدید بسازید.
final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();

Sheets service = new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
		.setApplicationName(APPLICATION_NAME).build();
  1. سپس، فایل اکسل XLS/XLSX را با استفاده از Aspose.Cells برای جاوا بارگذاری کنید. همچنین نام اولین کاربرگ را در کتاب کار دریافت کنید.
// یک کتاب کار اکسل را بارگیری کنید
Workbook wb = new Workbook(_excelFileName);

// نام اولین کاربرگ را دریافت کنید
String defaultWorksheetName = wb.getWorksheets().get(0).getName().trim();

// همه کاربرگ ها را دریافت کنید
WorksheetCollection collection = wb.getWorksheets();
  1. روش createSpreadsheet را برای ایجاد یک صفحه گسترده جدید در Google Sheets فراخوانی کنید.
// یک صفحه گسترده Google جدید با کاربرگ پیش فرض ایجاد کنید
Spreadsheet spreadsheet = createSpreadsheet(service, wb.getFileName(), defaultWorksheetName);
  1. داده ها را از هر کاربرگ بخوانید و در یک لیست ذخیره کنید.
String range;

// از میان کاربرگ ها حلقه بزنید
for (int worksheetIndex = 0; worksheetIndex < collection.getCount(); worksheetIndex++) {
	// دریافت مرجع کاربرگ
	Worksheet ws = collection.get(worksheetIndex);

	if (worksheetIndex == 0) {
		// صفحه اول به طور پیش فرض ایجاد می شود، بنابراین فقط محدوده را تنظیم کنید
		range = defaultWorksheetName + "!A:Y";
	} else {
		// یک برگه جدید اضافه کنید
		addSheet(service, spreadsheet.getSpreadsheetId(), ws.getName().trim());
		range = ws.getName().trim() + "!A:Y";
	}

	// تعداد سطرها و ستون ها را دریافت کنید
	int rows = ws.getCells().getMaxDataRow();
	int cols = ws.getCells().getMaxDataColumn();

	List<List<Object>> worksheetData = new ArrayList<List<Object>>();

	// از میان ردیف ها حلقه بزنید
	for (int i = 0; i <= rows; i++) {
		List<Object> rowData = new ArrayList<Object>();

		// از طریق هر ستون در ردیف انتخاب شده حلقه بزنید
		for (int j = 0; j <= cols; j++) {
			if (ws.getCells().get(i, j).getValue() == null)
				rowData.add("");
			else
				rowData.add(ws.getCells().get(i, j).getValue());
		}

		// به داده های کاربرگ اضافه کنید
		worksheetData.add(rowData);
	}
  
  // TO-DO: درخواست پست کردن داده ها در Google Sheets را اجرا کنید 
}
  1. برای هر کاربرگ در فایل اکسل، درخواستی برای نوشتن داده ها در صفحه گسترده در Google Sheets ایجاد کنید.
// محدوده را تنظیم کنید
ValueRange body = new ValueRange();
body.setRange(range);

// مقادیر را تنظیم کنید
body.setValues(worksheetData);

// مقادیر را به Google Sheets صادر کنید
UpdateValuesResponse result = service.spreadsheets().values()
		.update(spreadsheet.getSpreadsheetId(), range, body).setValueInputOption("USER_ENTERED")
		.execute();

// خروجی چاپ
System.out.printf("%d cells updated.", result.getUpdatedCells());

روش کامل خواندن و صادر کردن داده ها از یک فایل اکسل به صفحه گسترده در Google Sheets در زیر آورده شده است.

private static void exportExcelToGoogle(String _excelFileName) {
	try {
		// یک سرویس مشتری مجاز API جدید بسازید.
		final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
		
		Sheets service = new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
				.setApplicationName(APPLICATION_NAME).build();
		
		// یک کتاب کار اکسل را بارگیری کنید
		Workbook wb = new Workbook(_excelFileName);
		
		// نام اولین کاربرگ را دریافت کنید
		String defaultWorksheetName = wb.getWorksheets().get(0).getName().trim();
		
		// همه کاربرگ ها را دریافت کنید
		WorksheetCollection collection = wb.getWorksheets();

		// یک صفحه گسترده Google جدید با کاربرگ پیش فرض ایجاد کنید
		Spreadsheet spreadsheet = createSpreadsheet(service, wb.getFileName(), defaultWorksheetName);

		System.out.println("Spreadsheet URL: " + spreadsheet.getSpreadsheetUrl());
		System.out.println("ID: " + spreadsheet.getSpreadsheetId());

		String range;

		// از میان کاربرگ ها حلقه بزنید
		for (int worksheetIndex = 0; worksheetIndex < collection.getCount(); worksheetIndex++) {
			// دریافت مرجع کاربرگ
			Worksheet ws = collection.get(worksheetIndex);

			if (worksheetIndex == 0) {
				// صفحه اول به طور پیش فرض ایجاد می شود، بنابراین فقط محدوده را تنظیم کنید
				range = defaultWorksheetName + "!A:Y";
			} else {
				// یک برگه جدید اضافه کنید
				addSheet(service, spreadsheet.getSpreadsheetId(), ws.getName().trim());
				range = ws.getName().trim() + "!A:Y";
			}

			// تعداد سطرها و ستون ها را دریافت کنید
			int rows = ws.getCells().getMaxDataRow();
			int cols = ws.getCells().getMaxDataColumn();

			List<List<Object>> worksheetData = new ArrayList<List<Object>>();

			// از میان ردیف ها حلقه بزنید
			for (int i = 0; i <= rows; i++) {
				List<Object> rowData = new ArrayList<Object>();

				// از طریق هر ستون در ردیف انتخاب شده حلقه بزنید
				for (int j = 0; j <= cols; j++) {
					if (ws.getCells().get(i, j).getValue() == null)
						rowData.add("");
					else
						rowData.add(ws.getCells().get(i, j).getValue());
				}

				// به داده های کاربرگ اضافه کنید
				worksheetData.add(rowData);
			}

			// محدوده را تنظیم کنید
			ValueRange body = new ValueRange();
			body.setRange(range);

			// مقادیر را تنظیم کنید
			body.setValues(worksheetData);

			// مقادیر را به Google Sheets صادر کنید
			UpdateValuesResponse result = service.spreadsheets().values()
					.update(spreadsheet.getSpreadsheetId(), range, body).setValueInputOption("USER_ENTERED")
					.execute();
			
			// خروجی چاپ
			System.out.printf("%d cells updated.", result.getUpdatedCells());

		}

		// صفحه گسترده گوگل را در مرورگر باز کنید
		Desktop desk = Desktop.getDesktop();
		desk.browse(new URI("https://docs.google.com/spreadsheets/d/" + spreadsheet.getSpreadsheetId()));
	} catch (Exception e) {
		System.out.println(e.getMessage());
	}
}

کد منبع کامل

در زیر کد منبع کامل برای تبدیل یک فایل اکسل XLSX به Google Sheets در جاوا آمده است.

package excel_to_google_sheets;

import com.aspose.cells.Workbook;
import com.aspose.cells.Worksheet;
import com.aspose.cells.WorksheetCollection;
import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.sheets.v4.Sheets;
import com.google.api.services.sheets.v4.SheetsScopes;
import com.google.api.services.sheets.v4.model.AddSheetRequest;
import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetRequest;
import com.google.api.services.sheets.v4.model.Request;
import com.google.api.services.sheets.v4.model.Sheet;
import com.google.api.services.sheets.v4.model.SheetProperties;
import com.google.api.services.sheets.v4.model.Spreadsheet;
import com.google.api.services.sheets.v4.model.SpreadsheetProperties;
import com.google.api.services.sheets.v4.model.UpdateValuesResponse;
import com.google.api.services.sheets.v4.model.ValueRange;
import java.awt.Desktop;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ExportExcelToGoogle {

	/**
	 * نمونه جهانی از حوزه های مورد نیاز. اگر این محدوده ها را اصلاح می کنید، حذف کنید
	 * توکن‌ها/پوشه‌هایی که قبلاً ذخیره کرده‌اید.
	 */
	private static final String APPLICATION_NAME = "Google Sheets API Java Quickstart";
	private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();
	private static final String TOKENS_DIRECTORY_PATH = "tokens";
	private static final List<String> SCOPES = Collections.singletonList(SheetsScopes.SPREADSHEETS);

	public static void main(String[] args) throws Exception {		
		// داده های اکسل را به Google Sheets صادر کنید
		exportExcelToGoogle("workbook.xlsx");
	}

	private static void exportExcelToGoogle(String _excelFileName) {
		try {
			// یک سرویس مشتری مجاز API جدید بسازید.
			final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
			
			Sheets service = new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
					.setApplicationName(APPLICATION_NAME).build();
			
			// یک کتاب کار اکسل را بارگیری کنید
			Workbook wb = new Workbook(_excelFileName);
			
			// نام اولین کاربرگ را دریافت کنید
			String defaultWorksheetName = wb.getWorksheets().get(0).getName().trim();
			
			// همه کاربرگ ها را دریافت کنید
			WorksheetCollection collection = wb.getWorksheets();
	
			// یک صفحه گسترده Google جدید با کاربرگ پیش فرض ایجاد کنید
			Spreadsheet spreadsheet = createSpreadsheet(service, wb.getFileName(), defaultWorksheetName);
	
			String range;
	
			// از میان کاربرگ ها حلقه بزنید
			for (int worksheetIndex = 0; worksheetIndex < collection.getCount(); worksheetIndex++) {
				// دریافت مرجع کاربرگ
				Worksheet ws = collection.get(worksheetIndex);
	
				if (worksheetIndex == 0) {
					// صفحه اول به طور پیش فرض ایجاد می شود، بنابراین فقط محدوده را تنظیم کنید
					range = defaultWorksheetName + "!A:Y";
				} else {
					// یک برگه جدید اضافه کنید
					addSheet(service, spreadsheet.getSpreadsheetId(), ws.getName().trim());
					range = ws.getName().trim() + "!A:Y";
				}
	
				// تعداد سطرها و ستون ها را دریافت کنید
				int rows = ws.getCells().getMaxDataRow();
				int cols = ws.getCells().getMaxDataColumn();
	
				List<List<Object>> worksheetData = new ArrayList<List<Object>>();
	
				// از میان ردیف ها حلقه بزنید
				for (int i = 0; i <= rows; i++) {
					List<Object> rowData = new ArrayList<Object>();
	
					// از طریق هر ستون در ردیف انتخاب شده حلقه بزنید
					for (int j = 0; j <= cols; j++) {
						if (ws.getCells().get(i, j).getValue() == null)
							rowData.add("");
						else
							rowData.add(ws.getCells().get(i, j).getValue());
					}
	
					// به داده های کاربرگ اضافه کنید
					worksheetData.add(rowData);
				}
	
				// محدوده را تنظیم کنید
				ValueRange body = new ValueRange();
				body.setRange(range);
	
				// مقادیر را تنظیم کنید
				body.setValues(worksheetData);
	
				// مقادیر را به Google Sheets صادر کنید
				UpdateValuesResponse result = service.spreadsheets().values()
						.update(spreadsheet.getSpreadsheetId(), range, body).setValueInputOption("USER_ENTERED")
						.execute();
				
				// خروجی چاپ
				System.out.printf("%d cells updated.", result.getUpdatedCells());
	
			}
	
			// صفحه گسترده گوگل را در مرورگر باز کنید
			Desktop desk = Desktop.getDesktop();
			desk.browse(new URI("https://docs.google.com/spreadsheets/d/" + spreadsheet.getSpreadsheetId()));
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}

	private static Spreadsheet createSpreadsheet(Sheets _service, String spreadsheetName, String _defaultSheetName)
			throws IOException {
		// یک صفحه گسترده جدید ایجاد کنید
		Spreadsheet spreadsheet = new Spreadsheet()
				.setProperties(new SpreadsheetProperties().setTitle(spreadsheetName));
	
		// یک برگه جدید ایجاد کنید
		Sheet sheet = new Sheet();
		sheet.setProperties(new SheetProperties());
		sheet.getProperties().setTitle(_defaultSheetName);
	
		// افزودن برگه به لیست
		List<Sheet> sheetList = new ArrayList<Sheet>();
		sheetList.add(sheet);
		spreadsheet.setSheets(sheetList);
	
		// درخواست را اجرا کنید
		spreadsheet = _service.spreadsheets().create(spreadsheet).setFields("spreadsheetId").execute();
		System.out.println("Spreadsheet ID: " + spreadsheet.getSpreadsheetId());
	
		return spreadsheet;
	}

	private static void addSheet(Sheets _service, String _spreadSheetID, String _sheetName) {
		try {
			// افزودن برگه جدید
			AddSheetRequest addSheetRequest = new AddSheetRequest();
			addSheetRequest.setProperties(new SheetProperties());
			addSheetRequest.getProperties().setTitle(_sheetName);
	
			// ایجاد درخواست به روز رسانی
			BatchUpdateSpreadsheetRequest batchUpdateSpreadsheetRequest = new BatchUpdateSpreadsheetRequest();
			Request req = new Request();
			req.setAddSheet(addSheetRequest);
			batchUpdateSpreadsheetRequest.setRequests(new ArrayList<Request>());
			batchUpdateSpreadsheetRequest.getRequests().add(req);
	
			// درخواست را اجرا کنید
			_service.spreadsheets().batchUpdate(_spreadSheetID, batchUpdateSpreadsheetRequest).execute();
		} catch (Exception e) {
			System.out.println("Error in creating sheet: " + e.getMessage());
		}
	}

	private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
		// بارگذاری اسرار مشتری
		InputStream in = new FileInputStream(new File("credentials.json"));
		GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
	
		// ایجاد جریان و راه اندازی درخواست مجوز کاربر
		GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY,
				clientSecrets, SCOPES)
						.setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
						.setAccessType("offline").build();
		LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
		return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
	}
}

نسخه ی نمایشی - تبدیل برگه های اکسل به گوگل در جاوا

Java Excel to Google Sheets API - مجوز رایگان دریافت کنید

می توانید یک [مجوز موقت] رایگان دریافت کنید و بدون محدودیت ارزیابی از Aspose.Cells برای جاوا استفاده کنید.

نتیجه

در این مقاله یاد گرفتید که چگونه فایل های اکسل XLS یا XLSX را به صورت برنامه نویسی در جاوا به Google Sheets صادر کنید. ما دستورالعمل‌های کاملی را در مورد نحوه ایجاد یک پروژه Google Cloud، فعال کردن Google Sheets API، خواندن فایل‌های Excel و صادرات داده‌ها از فایل‌های Excel به Google Sheets ارائه کرده‌ایم. همچنین می توانید برای مطالعه بیشتر در مورد Aspose.Cells برای جاوا به اسناد مراجعه کنید. در صورت داشتن هرگونه سوال یا سوال، از طریق [تالار گفتمان8 ما را در جریان بگذارید.

همچنین ببینید